Warum ändert das Flag "g" das Ergebnis eines regulären JavaScript-Ausdrucks? [Duplikat]

8

Überlegen Sie:

%Vor%

Warum gibt die dritte Zeile false zurück? Wenn ich das Flag "g" entferne, wird true zurückgegeben.

    
Chopper Lee 06.09.2015, 08:39
quelle

1 Antwort

14

In JavaScript haben Objekte mit regulärem Ausdruck state . Dies ist wichtig, wenn das Flag g ("global") auf sie angewendet wird und manchmal auf ungewöhnliche Weise gilt. Dieser Status ist der Index, in dem die Übereinstimmung zuletzt aufgetreten ist. Dies ist die .lastIndex -Eigenschaft der Regex. Wenn Sie exec oder test erneut für dasselbe Regex-Objekt aufrufen, wird die Stelle wieder aufgerufen, an der sie unterbrochen wurde.

Was in deinem Beispiel passiert, ist für den zweiten Aufruf, es nimmt dort auf, wo es beim letzten Mal aufgehört hat, und so sieht es nach dem 10. Zeichen in der Zeichenkette aus - und findet dort keine Übereinstimmung, weil es keine gibt Text dort überhaupt (und selbst wenn es wäre, würde die ^ Behauptung nicht zusammenpassen).

Wir können sehen, was passiert, wenn wir uns die Eigenschaft lastIndex anschauen:

%Vor% %Vor%

Ohne das g -Flag behält das regex-Objekt keinen Zustand und beginnt jedes Mal am Anfang der Zeichenfolge:

%Vor% %Vor%

Randnotiz: Im Allgemeinen ist es am besten, reguläre Ausdrücke in JvaScript mit Regex-Literalen zu schreiben, anstatt den RegExp -Konstruktor und die Strings zu verwenden. In deinem Fall wäre das

%Vor%

Randnotiz 2: Es macht wenig Sinn, einen regulären Ausdruck mit ^ oder $ anchor und mit dem g -Flag zu definieren, es sei denn, Sie verwenden auch m (multiline) Flag, um zu ändern, was diese Anker bedeuten. Ohne m meinen sie "Anfang ( ^ ) oder Ende ( $ ) der Eingabe". Mit dem m Flag bedeuten sie "Anfang ( ^ ) oder Ende ( $ ) von Zeile ."

    
T.J. Crowder 06.09.2015, 08:49
quelle

Tags und Links