Come cercare le occorrenze di più di uno spazio tra le parole in una riga


109

Come cercare le occorrenze di più di uno spazio tra le parole in una riga

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

Tutte le precedenti sono corrispondenze valide per questa regex. Quale regex dovrei usare?


Stai cercando di controllare gli spazi vuoti consecutivi o tutti gli spazi in quella riga?
Sachin Shanbhag,

spazi vuoti consecutivi non tutti gli spazi
Sam

1
Cosa intendi esattamente con "tra le parole"? In due dei tuoi esempi, ci sono più spazi tra una parola e una cifra. E la punteggiatura (ad esempio, vuoi trovare la corrispondenza tra più spazi dopo un punto e prima della parola successiva)? E gli spazi prima / dopo l'ultimo carattere di una riga? Vuoi abbinare anche le schede? E le linee che non consistono altro che spazi bianchi?
Tim Pietzcker

spazi tra "contenente e 2", "contenente e 3", "primo e secondo", "secondo e tre" ... Sì, voglio trovare gli spazi dopo un punto e prima della parola successiva.
Sam

Risposte:


180
[ ]{2,}

SPAZIO (2 o più)

Puoi anche controllare che prima e dopo gli spazi seguano le parole. (non altri spazi bianchi come tabulazioni o nuove righe)

\w[ ]{2,}\w

lo stesso, ma puoi anche scegliere (catturare) solo gli spazi per attività come la sostituzione

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

o vedi che prima e dopo gli spazi c'è qualcosa, non solo caratteri alfanumerici (eccetto gli spazi)

[^\s]([ ]{2,})[^\s]

1
\wsignifica "caratteri alfanumerici", ovvero caratteri alfanumerici e di sottolineatura, ma non altri caratteri non spazi. Per verificare la presenza di spazi non bianchi, utilizzare \S(S maiuscola). Inoltre, il primo corrisponderà solo alle righe che contengono due o più spazi e nient'altro.
tdammers

Ho provato a far evolvere la domanda. Ho capito che mi mancava quello che hai detto \S, preferisco non fare affidamento sulle maiuscole / minuscole per tali funzionalità, è più facile da leggere.
AlexanderMP

1
Perché stai usando le ancore? Sta cercando spazi incorporati da qualche parte nelle linee.
Tim Pietzcker

nessun motivo particolare. All'inizio pensavo di averne bisogno, quindi li ho trascinati lungo tutto il processo. In effetti, hai ragione nel dire che ho sbagliato a usarli in questo caso. Modificherò subito la mia risposta.
AlexanderMP

1
\w[ ]{2,}\wnon riuscirà a trovare una corrispondenza word.<2 spaces>more wordso una stringa composta interamente da spazi. [^\s]([ ]{2,})[^\s]\wfallirà su righe che iniziano con spazi o stringhe come bla<2 spaces>....
Tim Pietzcker

12

Soluzione semplice:

/\s{2,}/

Ciò corrisponde a tutte le occorrenze di uno o più caratteri di spazio vuoto. Se è necessario abbinare l'intera riga, ma solo se contiene due o più caratteri di spazio bianco consecutivi:

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

Se gli spazi bianchi non devono essere consecutivi:

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

di .*solito è avido, il che significa che raggiungerà la fine della stringa testata e tutto ciò che segue, se ci sono caratteri obbligatori, non corrisponderà. Di solito in questo caso è una buona pratica aggiungere ?, in questo modo .*?. Mi è successo usando PCRE di PHP
AlexanderMP

Corrisponde. "Greedy" significa che corrisponde il più possibile pur mantenendo lo schema nel suo insieme. /^.*b.*$/in effetti corrisponde "foobar", anche se ti aspetteresti che il primo greedy .*corrisponda già all'intera stringa.
tdammers

9

Questa regex seleziona tutti gli spazi, puoi usarla e sostituirla con un singolo spazio

\s+

esempio in python

result = re.sub('\s+',' ', data))

4

Cerca [ ]{2,}. Questo troverà due o più spazi adiacenti ovunque all'interno della linea. Abbinerà anche spazi iniziali e finali, nonché linee costituite interamente da spazi. Se non lo vuoi, controlla la risposta di Alexander.

In realtà, puoi lasciare fuori le parentesi, sono solo per chiarezza (altrimenti il ​​carattere spazio che viene ripetuto non è così ben visibile :)).

Il problema \s{2,}è che corrisponderà anche alle nuove righe sui file di Windows (dove le nuove righe sono indicate da CRLFo \r\ncui corrisponde \s{2}.

Se vuoi anche trovare più schede e spazi, usa [ \t]{2,}.


more than one space between words in a line. Com'è [ ]{2,}tra le parole? Hai mai letto la domanda?
AlexanderMP

Ecco perché ho fatto riferimento alla tua risposta nel caso in cui l'OP voglia davvero essere rigoroso come sta scrivendo. Forse dovremmo chiederglielo.
Tim Pietzcker

2

Ecco la mia soluzione

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

Questo rimuoverà tutte le cifre, le virgole e le nuove righe ma selezionerà lo spazio centrale come il set di dati di

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.