Ich erstelle ein RegExp-Objekt (in JavaScript), um auf das Vorhandensein einer Zahl zu prüfen:
%Vor%Ich benutze es so
%Vor%Die Ausgabe ist noch verwirrender:
%Vor% Wenn ich das Qualifikationsmerkmal g
lösche, verhält es sich wie erwartet.
Ist das ein Fehler, wie ich es glaube, oder ein seltsamer Teil der Spezifikation? Soll der g
-Kennzeichner auf diese Weise verwendet werden? (Ich benutze denselben Ausdruck für mehrere Aufgaben, daher habe ich das Qualifikationsmerkmal überhaupt)
Pro Dokumentation: Ссылка
test
, das mehrere Male für dieselbe globale reguläre Ausdrucksinstanz aufgerufen wird, geht über die vorherige Übereinstimmung hinaus.
Sie können dieses Verhalten bestätigen:
%Vor% Es ist nicht sinnvoll, das g
-Flag zu verwenden, wenn Sie nur eine einzige Übereinstimmung mit verschiedenen Strings bestätigen möchten.
Entfernen Sie das 'g'
-Flag. Wenn Sie das Flag 'g
'verwenden, aktualisiert es die lastIndex
-Eigenschaft der Regex (Vorbereitung für eine nachfolgende Suche in der gleichen Zeichenfolge) und startet dann die nächste Suche von diesem Indexwert (wodurch Sie eine falsche Lesung auf Ihrem geben) nächste Suche).
Ähnliche Fragen und Antworten hier: Warum ist Regex Javascript // g? Flagge beeinflussen Zustand?
Laut MDN ,
Wie bei
exec
(oder in Kombination damit), wurdetest
mehrmals aufgerufen auf der gleichen globalen regulären Ausdruck Instanz wird über die vorheriges Spiel.
Technisch gesehen sagt die ECMAScript 5.1 Spezifikation
15.10.6.3 RegExp.prototype.test ( String)
Die folgenden Schritte werden ausgeführt:
- Die Übereinstimmung sei das Ergebnis der Evaluierung des
RegExp.prototype.exec
(15.10.6.2) -Algorithmus für dieses RegExp-Objekt mit string als Argument.- Wenn nicht gleich null ist, geben Sie
true
; sonst gibfalse
zurück.15.10.6.2 RegExp.prototype.exec ( String)
Führt eine reguläre Ausdrucksübereinstimmung von string mit dem regulären aus Ausdruck und gibt ein Array-Objekt mit den Ergebnissen der match, oder
null
, wenn string nicht übereinstimmt.Der String ToString ( string ) wird nach einem Vorkommen von Regulärer Ausdruck Muster wie folgt:
- Sei R dieses RegExp-Objekt.
- [...]
- [...]
- Lassen Sie lastIndex das Ergebnis des Aufrufs der internen Methode [[Get]] von R mit dem Argument "
lastIndex
" sein.- Sei i der Wert von ToInteger ( lastIndex ).
- Sei global das Ergebnis des Aufrufs der internen Methode [[Get]] von R mit dem Argument "
global
".- Wenn global
false
ist, dann i = 0.- [...]
- [...]
- Lassen Sie e r sein endIndex Wert sein.
- Wenn global
true
ist,
- Rufen Sie die interne Methode [[Put]] von R mit den Argumenten "
auflastIndex
", e undtrue
.- [...]
Um dies zu vermeiden, können Sie
verwenden Vermeiden Sie die Verwendung des globalen Flags g
Auf diese Weise wird i
in Schritt 7 0
anstelle von lastIndex
.
Setzen Sie lastIndex
nach jeder Verwendung manuell zurück
Der Wert der Eigenschaft
lastIndex
gibt die Position der Zeichenfolge an an welches das nächste Spiel beginnen soll.
Zum Beispiel
%Vor% Verwenden Sie match
oder search
string-Methoden
match
setzt lastIndex
auf 0 zurück und search
ignoriert es:
15.5.4.10 String.prototype.match ( regexp)
[...] [Wenn] global ist
true
, rufen Sie die interne Methode [[Put]] von rx mit den Argumenten "lastIndex
" und auf 0. [...]15.5.4.12 String.prototype.search ( regexp)
[...] Durchsucht den Wert string von Anfang an nach einem Vorkommen von Regulärer Ausdruck Muster rx . [...] Die
lastIndex
undglobal
Eigenschaften von regexp werden bei der Suche ignoriert. [...]
Zum Beispiel
%Vor%Tags und Links javascript regex google-chrome