Come verificare se una riga è vuota usando regex


154

Sto cercando di creare una regex semplice che verificherà se una riga è vuota o meno.

Astuccio;

"    some"   // not blank
"   " //blank
"" // blank

Qui vuoto significa che cosa stai significando. Una linea contiene pieni di spazi bianchi o una linea non contiene nulla. Se si desidera abbinare una riga che non contiene nulla, utilizzare '/ ^ $ /'
Badri Gs

Risposte:


329

Lo schema che desideri è qualcosa del genere in modalità multilinea:

^\s*$

Spiegazione:

  • ^ è l'inizio dell'ancoraggio della stringa.
  • $ è la fine dell'ancoraggio della stringa.
  • \s è la classe di caratteri degli spazi bianchi.
  • * è la ripetizione zero o maggiore di.

In modalità multilinea ^e $corrisponde anche all'inizio e alla fine della riga.

Riferimenti:


Un'alternativa non regex:

Puoi anche verificare se una determinata stringa lineè "vuota" (ovvero contiene solo spazi bianchi) trim()inserendola, quindi verificando se la stringa risultante isEmpty().

In Java, questo sarebbe qualcosa del genere:

if (line.trim().isEmpty()) {
    // line is "blank"
}

La soluzione regex può anche essere semplificata senza ancore (a causa di come matchesè definita in Java) come segue:

if (line.matches("\\s*")) {
    // line is "blank"
}

Riferimenti API


1
@Adnan: prendi nota del commento di Bart nella risposta di Marcelo; a seconda di come si desidera gestire più righe vuote, il motivo potrebbe cambiare leggermente.
poligenilubrificanti

Bene, sto leggendo un file da Java, riga per riga, quindi presumo che questo andrà bene.
Adnan,

1
che sembra geniale con line.trim: D
Adnan,

1
eccellente ora i codici vengono eseguiti da 1,6 secondi a> 1 secondo Grazie.
Adnan,

in pitone: if line.strip(): poiché una stringa vuota restituisceFalse
John Mark,

58

In realtà in modalità multilinea una risposta più corretta è questa:

/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

La risposta accettata: ^\s*$non corrisponde a uno scenario quando l'ultima riga è vuota (in modalità multilinea).


Esatto, e ho confermato che è così. La risposta accettata ha perso molte righe vuote nel mio file, ma questo le ha colte tutte. L'unione di entrambe le regex cattura ogni caso.
Elmor,

1
Questa risposta ha funzionato perfettamente in uno strumento come Notepad ++. La risposta accettata corrispondeva a più righe vuote ma non a singole righe vuote.
Giacomo

Nel mio caso, la risposta accettata non funziona in Sublime Text 3 e funziona.
Yangsibai,

1
La risposta accettata ha funzionato per il mio caso, multiline. Questo fa.
Robert Gabriel,

1
questa dovrebbe essere la risposta migliore.
Q il

12

Prova questo:

^\s*$

5
@Adnan, nota che \scorrisponde anche alle interruzioni di riga, quindi non "troverai" singole righe vuote all'interno di una stringa contenente successive righe vuote.
Bart Kiers,

6

Il regex più portatile sarebbe ^[ \t\n]*$abbinare una stringa vuota (si noti che sarebbe necessario sostituire \te \ncon tab e newline di conseguenza) e [^ \n\t]abbinare una stringa non di spazi bianchi.


Almeno cambierei il singolo spazio con la classe[ \t]
Bart Kiers,

1
Su Windows è inoltre necessario considerare il carattere di ritorno a capo in \rmodo che la regex sia ^[ \t\r\n]*$. Ma ^\s*$è meglio, più conciso. Se non vuoi abbinare le nuove righe, puoi usare \h(che significa spazi bianchi orizzontali) come in^\h*$
ps.pf

5

Credito completo a bchr02 per questa risposta . Tuttavia, ho dovuto modificarlo un po 'per catturare lo scenario per le righe che hanno */(fine commento) seguite da una riga vuota. Il regex corrispondeva alla riga non vuota con */.

Nuovo: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm

Tutto quello che ho fatto è stato aggiungere ^come secondo carattere per indicare l'inizio della riga.


Perché non commentare la risposta di bchr02 e suggerire il miglioramento della sua risposta?
adamlogan,

1
@adamlogan sì, a memoria, penso di volerlo fare in quel momento, ma non avevo abbastanza reputazione per commentare il post di qualcun altro, quindi ho dovuto farlo in questo modo.
John Henry,

3

Qui vuoto significa che cosa stai significando.
Una linea contiene pieni di spazi bianchi o una linea non contiene nulla.
Se si desidera abbinare una riga che non contiene nulla, utilizzare '/ ^ $ /'.


-1

Bene ... ho armeggiato (usando notepadd ++) e questa è la soluzione che ho trovato

\ n \ s

\ n per la fine della riga (dove inizi la corrispondenza) - il punto di inserimento non sarebbe di aiuto nel mio caso poiché l'inizio della riga è una stringa \ s occupa qualsiasi spazio fino alla stringa successiva

spero che sia d'aiuto


OP vuole una risposta regex, che è stata data, e non riguarda i nuovi caratteri di linea.
Moody_Mudskipper,

l'utente chiede un "regex semplice che verifichi se una riga è vuota" questo regex (testato su regexpal.com) fa esattamente questo. perché non lo provi?
M_TRONIC,

utilizzando R, il nostro vettore di prova: test_vec <- c(" some"," ",""). la soluzione: grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSEla soluzione ha votato: grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. la soluzione votata dà il risultato atteso, la tua no.
Moody_Mudskipper,

come ho detto, l'ho usato su notepad ++ e ha funzionato. il tuo no. quindi immagino che possiamo essere d'accordo per non essere d'accordo!
M_TRONIC,

Non sono davvero sicuro di quello che stai facendo, stai facendo ctrl+fin notepad ++? In questo caso puoi trovare (anche se in realtà non corrispondono) le righe vuote selezionando la modalità di ricerca "Estesa" e cercando "\ n \ s", se selezioni "Espressione regolare", la stringa corrisponderà allo stesso e puoi prova anche la soluzione di @polygenelubricants. Quest'ultima corrisponderà davvero alla linea, puoi controllare e vedere la differenza. Ti suggerirei di modificare la tua risposta per essere più chiaro su ciò che stai avvisando, in modo che i lettori possano prendere più valore da esso.
Moody_Mudskipper
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.