Como pesquisar ocorrências de mais de um espaço entre palavras em uma linha

109

Como pesquisar ocorrências de mais de um espaço entre palavras em uma linha

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

Todos os itens acima são correspondências válidas para este regex. Qual regex devo usar?

Sam
fonte
Você está tentando verificar os espaços em branco consecutivos ou todos os espaços nessa linha?
Sachin Shanbhag
espaços em branco consecutivos, nem todos os espaços
Sam,
1
O que exatamente você quer dizer com "entre palavras"? Em dois de seus exemplos, existem vários espaços entre uma palavra e um dígito. E quanto à pontuação (por exemplo, você deseja combinar vários espaços após um ponto e antes da próxima palavra)? E quanto aos espaços antes / depois do último caractere em uma linha? Você deseja corresponder as guias também? E quanto às linhas que consistem em nada além de espaços em branco?
Tim Pietzcker,
espaços entre "contendo e 2", "contendo e 3", "primeiro e segundo", "segundo e três" ... Sim, eu quero combinar os espaços após um ponto e antes da próxima palavra.
Sam,

Respostas:

180
[ ]{2,}

ESPAÇO (2 ou mais)

Você também pode verificar se antes e depois desses espaços vêm as palavras. (não outros espaços em branco, como guias ou novas linhas)

\w[ ]{2,}\w

o mesmo, mas você também pode escolher (capturar) apenas os espaços para tarefas como substituição

\w([ ]{2,})\w

ou veja que antes e depois dos espaços há qualquer coisa, não apenas caracteres de palavras (exceto espaços em branco)

[^\s]([ ]{2,})[^\s]
AlexanderMP
fonte
1
\wsignifica 'caracteres de palavra', ou seja, alfanuméricos e sublinhados, mas não outros caracteres que não sejam espaços. Para verificar se há espaços não em branco, use \S(S maiúsculo). Além disso, o primeiro corresponderá apenas a linhas que contenham dois ou mais espaços e nada mais.
tdammers
Tentei desenvolver a questão. Percebi que perdi o que você falou \S, só prefiro não contar com maiúsculas e minúsculas para essa funcionalidade, é mais fácil de ler.
AlexanderMP
1
Por que você está usando âncoras? Ele está procurando espaços embutidos em algum lugar nas linhas.
Tim Pietzcker,
nenhuma razão particular. A princípio pensei que precisava deles, então arrastei-os ao longo do processo. Na verdade, você está certo ao dizer que estou errado em usá-los neste caso. Vou editar minha resposta imediatamente.
AlexanderMP
1
\w[ ]{2,}\wirá falhar na correspondência word.<2 spaces>more wordsou uma string que consiste inteiramente em espaços. [^\s]([ ]{2,})[^\s]\wfalhará em linhas que começam com espaços ou strings como bla<2 spaces>....
Tim Pietzcker,
12

Solução simples:

/\s{2,}/

Isso corresponde a todas as ocorrências de um ou mais caracteres de espaço em branco. Se você precisar corresponder a toda a linha, mas apenas se ela contiver dois ou mais caracteres de espaço em branco consecutivos:

/^.*\s{2,}.*$/

Se os espaços em branco não precisam ser consecutivos:

/^(.*\s.*){2,}$/
tdammers
fonte
O .*geralmente é ganancioso, o que significa que chegará ao final da string testada, e tudo o que se segue, se houver caracteres obrigatórios, não corresponderá. Normalmente, neste caso, é uma boa prática adicionar ?, como este .*?. Aconteceu comigo usando o PCRE do PHP
AlexanderMP
Combina. "Greedy" significa que corresponde ao máximo possível, embora ainda corresponda ao padrão como um todo. /^.*b.*$/na verdade corresponde "foobar", embora você esperasse que o primeiro greedy já .*correspondesse à string inteira.
tdammers
9

Este regex seleciona todos os espaços, você pode usar isso e substituí-lo por um único espaço

\s+

exemplo em python

result = re.sub('\s+',' ', data))
Owen Yuwono
fonte
4

Pesquise [ ]{2,}. Isso encontrará dois ou mais espaços adjacentes em qualquer lugar dentro da linha. Ele também corresponderá aos espaços à esquerda e à direita, bem como às linhas que consistem inteiramente em espaços. Se você não quer isso, verifique a resposta de Alexander.

Na verdade, você pode omitir os colchetes, eles são apenas para maior clareza (caso contrário, o caractere de espaço que está sendo repetido não é tão bem visível :)).

O problema com \s{2,}é que ele também corresponderá às novas linhas nos arquivos do Windows (onde as novas linhas são indicadas por CRLFou \r\nque correspondem a \s{2}.

Se você também deseja encontrar várias tabulações e espaços, use [ \t]{2,}.

Tim Pietzcker
fonte
more than one space between words in a line. Como estão as [ ]{2,}palavras? Você ao menos leu a pergunta?
AlexanderMP
É por isso que me referi à sua resposta, caso o OP realmente queira ser tão rígido quanto está escrevendo. Talvez devêssemos perguntar a ele.
Tim Pietzcker,
2

Aqui está minha solução

[^0-9A-Z,\n]

Isso removerá todos os dígitos, vírgulas e novas linhas, mas selecionará o espaço do meio, como conjunto de dados de

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Ojitha
fonte