Per risolvere il problema, è possibile rimuovere il flag g
o ripristinare lastIndex
come in
var reg = /a/g;
console.log(reg.test("a"));
reg.lastIndex = 0;
console.log(reg.test("a"));
Il problema sorge perché test
si basa su exec
che cerca più partite dopo la prima, se superato la stessa stringa e il flag g
è presente.
15.10.6.3RegExp.prototype.test(string)
# Ⓣ Ⓡ
sono prese le seguenti operazioni:
- Let partita essere il risultato della valutazione del (15.10.6.2) algoritmo
RegExp.prototype.exec
su questo RegExp
oggetto utilizzando stringa come argomento.
- Se corrisponde a non è
null
, quindi restituire true
; altrimenti restituire false
.
La parte fondamentale di exec
è punto 6 della 15.10.6.2:
6. Let globale sia il risultato della chiamata al [[Get]] metodo interno di R con argomento "globale".
7. Se globale è falsa, allora lasciate i = 0.
Quando i
non viene reimpostato a 0, poi exec
(e quindi test
) non iniziare a guardare l'inizio della stringa.
Questo è utile per exec
perché si può ciclo per gestire ogni partita:
var myRegex = /o/g;
var myString = "fooo";
for (var match; match = myRegex.exec(myString);) {
alert(match + " at " + myRegex.lastIndex);
}
ma ovviamente non è così utile per test
.
fonte
2012-01-18 14:13:34
Il che significa che dovrei impostare lastIndex su 0 me stesso, giusto? – NStal
+1 buona spiegazione, non lo sapevo. –
@NStal, Sì, l'impostazione 'lastIndex' su 0 prima che il test risolva il problema. –