In einer Perl-SO answer , ein Poster verwendete diesen Code, um leere Strings zu finden:
%Vor%Zu welchem brian d foy kommentiert:
Das kann man nicht wirklich sagen, weil das einer bestimmten nicht leeren Zeichenfolge entspricht.
Frage : Welche nicht leere Zeichenkette wird damit abgeglichen? Ist es eine Zeichenfolge, die nur aus " \r
" besteht?
Schauen wir uns die Dokumente an, warum nicht? Zitieren perlre ,
$
: Entspricht dem Ende der Zeile (oder vor dem Zeilenende am Ende)
Gegeben
\z
: Übereinstimmung nur am Ende der Zeichenfolge
Das bedeutet /^$/
entspricht /^\n?\z/
.
Beachten Sie, dass /m
die Übereinstimmung von ^
und $
ändert. Unter /m
, ^
stimmt am Anfang jeder "Zeile" überein, und $
stimmt vor jeder neuen Zeile und am Ende der Zeichenfolge überein.
Und mit / m:
%Vor% \A
, \Z
und \z
sind nicht von /m
betroffen:
Wenn Sie testen möchten, ob eine Zeichenfolge leer ist, verwenden Sie /^\z/
oder sehen Sie nach, ob Länge von $str
ist Null (was ich bevorzuge).
Ausgabe:
%Vor% Die Regex /^$/
stimmt mit der nicht leeren Zeichenfolge "\n"
überein.
Standardmäßig wird für die Übereinstimmung regulärer Ausdrücke in Perl davon ausgegangen, dass die Zeichenfolge eine einzelne "Textzeile" enthält.
^
entspricht dem Zeilenanfang; In Ermangelung eines /m
-Modifikators entspricht dies dem Anfang der Zeichenfolge.
$
entspricht entweder dem Ende der Zeile oder vor einem Zeilenende am Ende (das ist, was /^$/
mit der nicht leeren Zeichenfolge "\n"
übereinstimmt).
Zitieren perldoc perlre
:
Standardmäßig entspricht das Zeichen "^" nur dem Zeichen Beginn des Strings, das "$" Zeichen nur das Ende (oder vor dem Newline am Ende), und Perl macht gewisse Optimierungen mit dem Annahme, dass die Zeichenfolge nur eine Zeile enthält. Eingebettete Zeilenumbrüche wird nicht mit "^" oder "$" verglichen. Sie können jedoch wünschen, a string als mehrzeiligen Puffer, so dass das "^" nach jedem übereinstimmt Newline innerhalb der Zeichenfolge (außer wenn die Newline das letzte Zeichen ist in der Zeichenfolge), und "$" wird vor jedem Zeilenumbruch übereinstimmen. Auf Kosten von ein wenig mehr Overhead, können Sie dies tun, indem Sie den Modifikator / m auf der Mustervergleichsoperator.