Interessanter Test von Javascript RegExp [duplizieren]

8

Ich habe einen Javascript-RegExp-Test geschrieben, um das Datumstringformat zu erkennen, ich habe aus Versehen ein redundantes "g" -Flag hinzugefügt und etwas Interessantes gefunden.

%Vor%

Ich habe eine "wahre" gefolgt von einer "falschen", dann eine andere "wahre", dann noch eine "falsche".

Wenn ich eine Schleife verwende, um es auszuführen, fand ich etwas Interessanteres, ich habe vier "wahre" in IE und Safari, und wahr, falsch, wahr, falsch in FF, Chrome.

%Vor%

Hat jemand eine Idee zu erklären, warum der Javascript-Regex sich so verhält und welche Ursachen Browser unterschiedliche Ergebnisse liefern? (bezogen auf Variablendeklaration und Lebensbereich?)

    
Darkthread 03.03.2009, 02:18
quelle

2 Antworten

19

Wenn Sie ein globales Flag für eine JS-RegExp verwenden, halten die Methoden "test" und "exec" bei der ersten Übereinstimmung an, behalten aber einen Zeiger auf die Stelle, an der sie die Suche in der Zeichenfolge beendet haben. Dieser Zeiger kann auf der Eigenschaft lastIndex überprüft werden. Wenn Sie "test" oder "exec" erneut aufrufen, beginnt die Suche nach einer Übereinstimmung, beginnend bei lastIndex .

Wenn Sie also eine RegExp für eine Zeichenfolge testen, die der gesamten Zeichenfolge entspricht, wird lastIndex auf das Ende der Zeichenfolge gesetzt. Das nächste Mal, wenn Sie es testen, beginnt es am Ende der Zeichenfolge, gibt false zurück und setzt lastIndex auf Null zurück.

Der MDC hat eine anständige Erklärung zu diesem Verhalten.

    
Prestaul 03.03.2009, 02:30
quelle
0

Um dieses seltsame Verhalten zu vermeiden, verwenden Sie nicht das globale (g) -Flag.

Dieser Code sollte ausgeben: 'True', 'True', 'True', 'True'

%Vor%

Die globale (g) Ebene setzte die Eigenschaft RegExp.lastIndex. Also beginnt jeder Test () dort, wo der letzte gestoppt wurde.

Weitere Informationen finden Sie in der Dokumentation zu RegExp.lastIndex

    
Hemerson Varela 22.04.2014 16:12
quelle

Tags und Links