So überprüfen Sie mithilfe von Regex, ob eine Zeile leer ist


154

Ich versuche, einen einfachen regulären Ausdruck zu erstellen, der überprüft, ob eine Zeile leer ist oder nicht.

Fall;

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

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.

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 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 :

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

API-Referenzen


1
@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.
Robert Gabriel

1
Dies sollte die beste Antwort sein.
Q i

11

Versuche dies:

^\s*$

5
@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 '/ ^ $ /'.


-1

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


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.
Moody_Mudskipper
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.