Sto cercando di creare una regex semplice che verificherà se una riga è vuota o meno.
Astuccio;
" some" // not blank
" " //blank
"" // blank
Sto cercando di creare una regex semplice che verificherà se una riga è vuota o meno.
Astuccio;
" some" // not blank
" " //blank
"" // blank
Risposte:
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.
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"
}
String String.trim()
boolean String.isEmpty()
trueif, e solo if, length()è 0.boolean String.matches(String regex)
if line.strip(): poiché una stringa vuota restituisceFalse
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).
Prova questo:
^\s*$
\scorrisponde anche alle interruzioni di riga, quindi non "troverai" singole righe vuote all'interno di una stringa contenente successive righe vuote.
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.
[ \t]
\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*$
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.
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
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.
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.