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
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
Antworten:
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 matches
Definition in Java) wie folgt vereinfacht werden :
if (line.matches("\\s*")) {
// line is "blank"
}
String String.trim()
boolean String.isEmpty()
true
wenn und nur wenn, length()
ist 0
.boolean String.matches(String regex)
if line.strip():
da eine leere Zeichenfolge ergibtFalse
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).
Versuche dies:
^\s*$
\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.
[ \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.
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
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.