2012-01-18 16 views

risposta

24

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:

  1. Let partita essere il risultato della valutazione del (15.10.6.2) algoritmo RegExp.prototype.exec su questo RegExp oggetto utilizzando stringa come argomento.
  2. 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.

+0

Il che significa che dovrei impostare lastIndex su 0 me stesso, giusto? – NStal

+0

+1 buona spiegazione, non lo sapevo. –

+0

@NStal, Sì, l'impostazione 'lastIndex' su 0 prima che il test risolva il problema. –

2

In genere viene scelto un test per verificare se alcuni pattern corrispondono, ma il flag globale consente di scorrere una stringa per contare le corrispondenze o, come exec, eseguire qualcosa con ogni lastIndex. Un altro uso è impostare l'ultimoIndice del rx prima che il test venga eseguito, ignorare le corrispondenze prima di un indice di carattere.

var count=0, rx=/\s+/g, rx.lastIndex=100; 
while(rx.test(string))count++; 
Problemi correlati