Was ist das Problem mit diesem regulären Ausdruck, wenn ich das globale Flag und das Flag ohne Berücksichtigung der Groß- und Kleinschreibung verwende? Die Abfrage ist eine vom Benutzer generierte Eingabe. Das Ergebnis sollte [wahr, wahr] sein.
var query = 'Foo B';
var re = new RegExp(query, 'gi');
var result = [];
result.push(re.test('Foo Bar'));
result.push(re.test('Foo Bar'));
// result will be [true, false]
var reg = /^a$/g;
for(i = 0; i++ < 10;)
console.log(reg.test("a"));
javascript
regex
Über
quelle
quelle
re
.Antworten:
Das
RegExp
Objekt verfolgt,lastIndex
wo eine Übereinstimmung stattgefunden hat. Bei nachfolgenden Übereinstimmungen beginnt es also mit dem zuletzt verwendeten Index anstelle von 0. Sehen Sie sich Folgendes an:Wenn Sie nicht
lastIndex
nach jedem Test manuell auf 0 zurücksetzen möchten , entfernen Sie einfach dasg
Flag.Hier ist der Algorithmus, den die Spezifikationen vorschreiben (Abschnitt 15.10.6.2):
quelle
lastIndex
ist in den Schritten 5, 6 und 11. Ihre Eröffnungserklärung ist nur wahr, wenn die globale Flagge gesetzt ist.Sie verwenden ein einzelnes
RegExp
Objekt und führen es mehrmals aus. Bei jeder aufeinanderfolgenden Ausführung wird ab dem letzten Übereinstimmungsindex fortgesetzt.Sie müssen den regulären Ausdruck "zurücksetzen", um vor jeder Ausführung von vorne zu beginnen:
Allerdings ist es möglicherweise besser lesbar, jedes Mal ein neues RegExp-Objekt zu erstellen (der Overhead ist minimal, da RegExp ohnehin zwischengespeichert wird):
quelle
g
Flagge.RegExp.prototype.test
Aktualisiert dielastIndex
Eigenschaft der regulären Ausdrücke, sodass jeder Test dort beginnt, wo der letzte gestoppt wurde. Ich würde vorschlagen, zu verwenden,String.prototype.match
da es dielastIndex
Eigenschaft nicht aktualisiert :Hinweis:
!!
Konvertiert es in einen Booleschen Wert und invertiert dann den Booleschen Wert, sodass er das Ergebnis widerspiegelt.Alternativ können Sie die
lastIndex
Eigenschaft auch einfach zurücksetzen :quelle
Durch Entfernen des globalen
g
Flags wird Ihr Problem behoben.Sollte sein
quelle
Sie müssen re.lastIndex = 0 setzen, da mit g flag regex die letzte aufgetretene Übereinstimmung verfolgt wird, sodass beim Test nicht dieselbe Zeichenfolge getestet wird. Dazu müssen Sie re.lastIndex = 0 ausführen
quelle
Wenn Sie das Flag / g verwenden, wird die Suche nach einem Treffer fortgesetzt.
Wenn die Übereinstimmung erfolgreich ist, gibt die exec () -Methode ein Array zurück und aktualisiert die Eigenschaften des Objekts mit regulären Ausdrücken.
Vor Ihrer ersten Suche:
Nach der ersten Suche
Entfernen Sie das g und es beendet die Suche nach jedem Aufruf von exec ().
quelle
exec
.Ich hatte die Funktion:
Der erste Anruf funktioniert. Der zweite Anruf nicht. Die
slice
Operation beschwert sich über einen Nullwert. Ich nehme an, das liegt an derre.lastIndex
. Dies ist seltsam, da ich erwarten würde, dassRegExp
bei jedem Aufruf der Funktion eine neue zugewiesen wird und nicht für mehrere Aufrufe meiner Funktion freigegeben wird.Als ich es geändert habe zu:
Dann bekomme ich den
lastIndex
Holdover-Effekt nicht. Es funktioniert so, wie ich es erwarten würde.quelle