Hier bedeutet Leer, was Sie meinen. Eine Zeile enthält viele Leerzeichen oder eine Zeile enthält nichts. Wenn Sie mit einer Zeile übereinstimmen möchten, die nichts enthält, verwenden Sie '/ ^ $ /'
Badri Gs
Antworten:
328
Das gewünschte Muster ist im mehrzeiligen Modus ungefähr so:
^\s*$
Erläuterung:
^ ist der Beginn des String-Ankers.
$ ist das Ende des String-Ankers.
\s ist die Whitespace-Zeichenklasse.
* ist eine Wiederholung von null oder mehr von.
Im mehrzeiligen Modus ^und $passen Sie auch den Anfang und das Ende der Zeile an.
Sie können auch überprüfen, ob eine bestimmte Zeichenfolge line"leer" ist (dh nur Leerzeichen enthält), indem Sie sie trim()eingeben und dann überprüfen, ob die resultierende Zeichenfolge vorhanden ist isEmpty().
In Java wäre dies ungefähr so:
if(line.trim().isEmpty()){// line is "blank"}
Die Regex-Lösung kann auch ohne Anker (aufgrund der matchesDefinition in Java) wie folgt vereinfacht werden :
@Adnan: Beachten Sie Barts Kommentar in Marcelos Antwort. Je nachdem, wie Sie mit mehreren Leerzeilen umgehen möchten, kann sich das Muster geringfügig ändern.
Polygenelubricants
Nun, ich lese eine Datei aus Java, Zeile für Zeile, also gehe ich davon aus, dass dies in Ordnung ist.
Adnan
1
das scheint mit line.trim brillant: D
Adnan
1
Hervorragend, die Codes werden jetzt von 1,6 Sekunden bis> 1 Sekunde ausgeführt. Vielen Dank.
Adnan
in Python: if line.strip(): da eine leere Zeichenfolge ergibtFalse
John Mark
57
Im mehrzeiligen Modus lautet die richtige Antwort:
/((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Die akzeptierte Antwort: ^\s*$Entspricht keinem Szenario, wenn die letzte Zeile leer ist (im mehrzeiligen Modus).
Genau, und ich habe bestätigt, dass dies der Fall ist. Die akzeptierte Antwort hat viele leere Zeilen in meiner Datei übersehen, aber das hat sie alle erwischt. Die Vereinigung beider Regexe erfasst jeden Fall.
Elmor
1
Diese Antwort funktionierte perfekt in einem Tool wie Notepad ++. Die akzeptierte Antwort stimmte mit mehreren Leerzeilen überein, jedoch nicht mit einzelnen Leerzeilen.
James
In meinem Fall funktioniert die akzeptierte Antwort in Sublime Text 3 nicht, und dies funktioniert.
Yangsibai
1
Die akzeptierte Antwort funktionierte für meinen Fall, mehrzeilig. Das macht.
@Adnan, beachten Sie, dass dies \sauch mit Zeilenumbrüchen übereinstimmt, sodass Sie keine einzelnen leeren Zeilen in einer Zeichenfolge finden, die aufeinanderfolgende leere Zeilen enthält.
Bart Kiers
5
Die meisten tragbaren regex wäre ^[ \t\n]*$eine leere Zeichenfolge übereinstimmen (beachten Sie, dass Sie ersetzen müssten \tund \nentsprechend mit Tab und Newline) und [^ \n\t]einen Nicht-Leerzeichen Zeichenfolge übereinstimmen.
Ich würde zumindest das einzelne Feld mit der Klasse ändern[ \t]
Bart Kiers
1
Unter Windows müssen Sie auch das Wagenrücklaufzeichen berücksichtigen, \rdamit der reguläre Ausdruck angezeigt wird ^[ \t\r\n]*$. Ist ^\s*$aber besser - prägnanter. Wenn Sie keine Zeilenumbrüche abgleichen möchten, können Sie \h(dh horizontale Leerzeichen) wie in^\h*$
ps.pf
4
Volle Gutschrift an bchr02 für diese Antwort . Ich musste es jedoch ein wenig ändern, um das Szenario für Zeilen zu erfassen, auf die */(Ende des Kommentars) eine leere Zeile folgt. Die Regex stimmte mit der nicht leeren Zeile überein */.
Neu: (^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Alles, was ich getan habe, ist ^als zweites Zeichen hinzuzufügen , um den Zeilenanfang zu kennzeichnen.
Warum nicht die Antwort von bchr02 kommentieren und die Verbesserung seiner Antwort vorschlagen?
Adamlogan
1
@adamlogan Ja, aus dem Gedächtnis, ich glaube, ich wollte es zu der Zeit tun, aber ich hatte nicht genug Ruf, um den Beitrag eines anderen zu kommentieren, also musste ich es so machen.
John Henry
3
Hier bedeutet Leer, was Sie meinen.
Eine Zeile enthält viele Leerzeichen oder eine Zeile enthält nichts.
Wenn Sie mit einer Zeile übereinstimmen möchten, die nichts enthält, verwenden Sie '/ ^ $ /'.
Nun ... Ich habe herumgebastelt (mit Notepadd ++) und dies ist die Lösung, die ich gefunden habe
\ n \ s
\ n für Zeilenende (wo Sie mit dem Abgleich beginnen) - das Caret wäre in meinem Fall nicht hilfreich, da der Anfang der Zeile eine Zeichenfolge ist, die bis zur nächsten Zeichenfolge Leerzeichen benötigt
OP möchte eine Regex-Antwort, die gegeben wurde, und handelt nicht von neuen Zeilenzeichen.
Moody_Mudskipper
Der Benutzer fragt nach einem "einfachen regulären Ausdruck, der prüft, ob eine Zeile leer ist". Dieser reguläre Ausdruck (getestet in regexpal.com) macht genau das. Warum testest du es nicht?
M_TRONIC
mit R, unserem Testvektor : test_vec <- c(" some"," ",""). Ihre Lösung : grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE, die gewählte Lösung : grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE. Die gewählte Lösung liefert das erwartete Ergebnis, Ihre nicht.
Moody_Mudskipper
Wie gesagt, ich habe dies auf Notepad ++ verwendet und es hat funktioniert. deine nicht. Ich denke, wir können uns darauf einigen, nicht zuzustimmen!
M_TRONIC
Ich bin mir nicht sicher, was du machst, machst du ctrl+fin Notepad ++? In diesem Fall können Sie die leeren Zeilen finden (obwohl sie nicht wirklich übereinstimmen), indem Sie den Suchmodus "Erweitert" auswählen und nach "\ n \ s" suchen. Wenn Sie "Regulärer Ausdruck" auswählen, stimmt Ihre Zeichenfolge mit derselben überein, und Sie können Probieren Sie auch die Lösung von @polygenelubricants aus. Letztere passt wirklich zur Linie. Sie können den Unterschied überprüfen und sehen. Ich würde vorschlagen, dass Sie Ihre Antwort so bearbeiten, dass klarer wird, was Sie empfehlen, damit die Leser mehr Wert daraus ziehen können it.
Antworten:
Das gewünschte Muster ist im mehrzeiligen Modus ungefähr so:
Erläuterung:
^
ist der Beginn des String-Ankers.$
ist das Ende des String-Ankers.\s
ist die Whitespace-Zeichenklasse.*
ist eine Wiederholung von null oder mehr von.Im mehrzeiligen Modus
^
und$
passen Sie auch den Anfang und das Ende der Zeile an.Verweise:
Eine Alternative ohne Regex:
Sie können auch überprüfen, ob eine bestimmte Zeichenfolge
line
"leer" ist (dh nur Leerzeichen enthält), indem Sie sietrim()
eingeben und dann überprüfen, ob die resultierende Zeichenfolge vorhanden istisEmpty()
.In Java wäre dies ungefähr so:
Die Regex-Lösung kann auch ohne Anker (aufgrund der
matches
Definition in Java) wie folgt vereinfacht werden :API-Referenzen
String String.trim()
boolean String.isEmpty()
true
wenn und nur wenn,length()
ist0
.boolean String.matches(String regex)
quelle
if line.strip():
da eine leere Zeichenfolge ergibtFalse
Im mehrzeiligen Modus lautet die richtige Antwort:
Die akzeptierte Antwort:
^\s*$
Entspricht keinem Szenario, wenn die letzte Zeile leer ist (im mehrzeiligen Modus).quelle
Versuche dies:
quelle
\s
auch mit Zeilenumbrüchen übereinstimmt, sodass Sie keine einzelnen leeren Zeilen in einer Zeichenfolge finden, die aufeinanderfolgende leere Zeilen enthält.Die meisten tragbaren regex wäre
^[ \t\n]*$
eine leere Zeichenfolge übereinstimmen (beachten Sie, dass Sie ersetzen müssten\t
und\n
entsprechend mit Tab und Newline) und[^ \n\t]
einen Nicht-Leerzeichen Zeichenfolge übereinstimmen.quelle
[ \t]
\r
damit der reguläre Ausdruck angezeigt wird^[ \t\r\n]*$
. Ist^\s*$
aber besser - prägnanter. Wenn Sie keine Zeilenumbrüche abgleichen möchten, können Sie\h
(dh horizontale Leerzeichen) wie in^\h*$
Volle Gutschrift an bchr02 für diese Antwort . Ich musste es jedoch ein wenig ändern, um das Szenario für Zeilen zu erfassen, auf die
*/
(Ende des Kommentars) eine leere Zeile folgt. Die Regex stimmte mit der nicht leeren Zeile überein*/
.Neu:
(^(\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/gm
Alles, was ich getan habe, ist
^
als zweites Zeichen hinzuzufügen , um den Zeilenanfang zu kennzeichnen.quelle
Hier bedeutet Leer, was Sie meinen.
Eine Zeile enthält viele Leerzeichen oder eine Zeile enthält nichts.
Wenn Sie mit einer Zeile übereinstimmen möchten, die nichts enthält, verwenden Sie '/ ^ $ /'.
quelle
Nun ... Ich habe herumgebastelt (mit Notepadd ++) und dies ist die Lösung, die ich gefunden habe
\ n \ s
\ n für Zeilenende (wo Sie mit dem Abgleich beginnen) - das Caret wäre in meinem Fall nicht hilfreich, da der Anfang der Zeile eine Zeichenfolge ist, die bis zur nächsten Zeichenfolge Leerzeichen benötigt
ich hoffe es hilft
quelle
test_vec <- c(" some"," ","")
. Ihre Lösung :grepl("\\n\\s",test_vec) # [1] FALSE FALSE FALSE
, die gewählte Lösung :grepl("^\\s*$",test_vec) # [1] FALSE TRUE TRUE
. Die gewählte Lösung liefert das erwartete Ergebnis, Ihre nicht.ctrl+f
in Notepad ++? In diesem Fall können Sie die leeren Zeilen finden (obwohl sie nicht wirklich übereinstimmen), indem Sie den Suchmodus "Erweitert" auswählen und nach "\ n \ s" suchen. Wenn Sie "Regulärer Ausdruck" auswählen, stimmt Ihre Zeichenfolge mit derselben überein, und Sie können Probieren Sie auch die Lösung von @polygenelubricants aus. Letztere passt wirklich zur Linie. Sie können den Unterschied überprüfen und sehen. Ich würde vorschlagen, dass Sie Ihre Antwort so bearbeiten, dass klarer wird, was Sie empfehlen, damit die Leser mehr Wert daraus ziehen können it.