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.