2010-05-17 8 views
43

Eventuali duplicati:
Javascript regex returning true.. then false.. then true.. etcPerché il mio regex.test javascript() darà alternando risultati

var r = /\d/g; 
var a = r.test("1"); // will be true 
var b = r.test("1"); // will be false 
console.log(a == b); // will be false 

Si prega di spiegare a me perché il risultato di r.test ("1 ") si alterna ad ogni chiamata?

Sono stato in grado di risolvere il problema che stavo avendo rimuovendo il modificatore g. Tuttavia mi piacerebbe ancora capire perché questo accade.

risposta

63

Quando si utilizza /g, l'oggetto regex salverà lo stato tra le chiamate (poiché si dovrebbe utilizzarlo per far corrispondere più chiamate). Corrisponde a una volta, ma le chiamate successive iniziano dopo la partita originale.

(Questo è un duplicato di Javascript regex returning true.. then false.. then true.. etc)

+0

grazie! Ho trovato alcuni ulteriori dettagli che spiegano che .test è fondamentalmente una scorciatoia per .exec()! = Null, ed è .exec() che memorizza l'ultimoIndice per la prossima chiamata. (http://www.regular-expressions.info/javascript.html) Ciò che è strano è che anche quando vengono date stringhe diverse per ogni chiamata, accade lo stesso. Does lastIndex non resetta se viene chiamato su una stringa diversa? –

+1

No, poiché 'lastIndex' è una proprietà della regex, non della stringa. In Perl, al contrario, è associato alla stringa (la proprietà 'pos'), mentre in Java è mantenuta dall'oggetto Matcher. 'lastIndex' è fonte di molte frustrazioni: http://blog.stevenlevithan.com/archives/fixing-javascript-regexp –

Problemi correlati