Welche nicht leere Zeichenkette funktioniert / ^ $ /?

8

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?

    
DVK 18.04.2012, 17:31
quelle

4 Antworten

7

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/ .

%Vor%

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.

%Vor%

Und mit / m:

%Vor%

\A , \Z und \z sind nicht von /m betroffen:

%Vor%     
ikegami 18.04.2012, 18:43
quelle
9
%Vor%

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%     
Sinan Ünür 18.04.2012 17:34
quelle
3

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.

    
Keith Thompson 18.04.2012 19:02
quelle
1

Skript:

%Vor%

Ausgabe:

%Vor%     
Ωmega 18.04.2012 19:16
quelle

Tags und Links