Unterschied zwischen RegExp-Konstruktor und Regex-Literaltestfunktion? [Duplikat]

8

Ich bin verwirrt darüber, wie das möglich ist ...

%Vor%

Der obige Code enthält die folgenden Werte

%Vor%

Aber wenn ich die Funktion "matcher.test" nacheinander ausführe, werde ich für den ersten Lauf und falsch für den zweiten Lauf wahr.

%Vor%

Wenn ich ein regexp-Literal wie

verwende %Vor%

und lauf es zurück nach hinten in Chrom Ich werde beide Male wahr. Gibt es eine Erklärung dafür?

Beispiel eines Back-to-Back-Laufs in der Chrome-Konsole, bei dem ein regexp-Objekt mit dem Konstruktor

erstellt wird %Vor%

Beispiel für die Verwendung von Back-to-Back-Aufrufen von Literal

%Vor%

Der Grund für diese Frage ist, wenn ich mit dem RegExp-Konstruktor und der Test-Funktion gegen eine Liste von Werten Spiele verloren habe ... Aber mit dem Literal bekomme ich alle Werte zurück, die ich erwarte

AKTUALISIEREN

%Vor%

Das Verschieben der Erstellung des Matcher in den Verschluss enthielt die fehlenden Ergebnisse. Das "d" ist eigentlich eine dynamisch erzeugte Zeichenkette, aber ich habe der Einfachheit halber "d" verwendet. Ich bin immer noch nicht sicher, jetzt einen neuen Ausdruck jedes Mal zu erstellen, wenn ich den Test tue, wenn ich über das Suggestions-Array iteriere, würde unbeabsichtigt Ergebnisse ausschließen, ist ein wenig verwirrend immer noch und hat wahrscheinlich etwas mit der Weiterentwicklung des Match-Tests zu tun. p>     

DRobertE 21.11.2012, 19:19
quelle

3 Antworten

10

Von RegExp.test() :

  

test , das mehrere Male für dieselbe globale reguläre Ausdrucksinstanz aufgerufen wird, geht über die vorherige Übereinstimmung hinaus.

Wenn Sie also eine Instanz von RegExp haben, rückt jeder Aufruf von test den Matcher vor. Sobald du das erste d gefunden hast, wird es darüber hinausschauen und versuchen, ein anderes d zu finden. Nun, es gibt keine mehr, also gibt es false zurück.

Auf der anderen Seite, wenn Sie tun:

%Vor%

Sie erstellen jedes Mal vor Ort eine neue RegExp -Instanz, so dass sie immer das erste d findet (und somit true zurückgibt).

    
NullUserException 21.11.2012, 19:25
quelle
0

Laut Mozilla Developer Network

  

Wie bei exec (oder in Kombination damit), Test mehrmals aufgerufen   auf der gleichen globalen regulären Ausdruck Instanz wird über die   vorheriges Spiel.

Ссылка

    
Aaron Kurtzhals 21.11.2012 19:26
quelle
0

Ich kann den Link ATM nicht finden, aber wie ich mich erinnere, ist dies ein bekanntes Problem mit der test -Methode in Kombination mit einem g -Muster: Die Übereinstimmungsposition ist nicht "vergessen" < irgendwie. Entweder lassen Sie das globale Flag und / oder die .match -Methode, und es funktioniert einwandfrei.

    
Elias Van Ootegem 21.11.2012 19:29
quelle

Tags und Links