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>
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).
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.
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.
Tags und Links javascript regex