2013-06-09 4 views
5

http://jsfiddle.net/bpt33/In che modo "g" nel metodo di test RegExp funziona in alternativa?

var t = ""; 

var a = ["atom-required","atom-label","atom-data-type","atom-regex"]; 

var r = /atom\-(label|required|regex|data\-type|class|is\-valid|field\-value|error)/i; 

function test(a, r){ 
    for(var i = 0; i<a.length; i++){ 
     t += a[i] + " => " + r.test(a[i]) + "<br/>"; 
    } 
} 

test(a, r); 

t += "<br/>"; 

a = ["atom-required","atom-label","atom-data-type","atom-regex"]; 

var r = /atom\-(label|required|regex|data\-type|class|is\-valid|field\-value|error)/gi; 

test(a, r); 

$("#results").get(0).innerHTML = t; 

Quando g non è specificato, esso funziona correttamente,

atom-required => true 
atom-label => true 
atom-data-type => true 
atom-regex => true 

Quando viene specificato g, funziona in alternativa

atom-required => true 
atom-label => false 
atom-data-type => true 
atom-regex => false 
+0

Come nota a margine, non c'è bisogno di scappare da '-' - è solo speciale in una classe di caratteri. – georg

+0

possibile duplicato di [Perché RegExp con flag globale in Javascript fornisce risultati errati?] (Http://stackoverflow.com/questions/1520800/why-regexp-with-global-flag-in-javascript-give-wrong-results) – Bergi

risposta

11

Perché con la g modificatore, l'espressione regolare diventa statico e riprende la ricerca successiva all'indice dopo l'ultima partita.

Quando non viene trovata alcuna corrispondenza, si ripristina automaticamente.

È possibile osservare il punto di partenza utilizzando la proprietà .lastIndex.

r.lastIndex; // 0 or some higher index 

È possibile reimpostare manualmente impostando la proprietà a 0.

r.lastIndex = 0 
+0

"Quando non viene trovata alcuna corrispondenza, si reimposta" e restituisce false – thejh

+0

@thejh: Sì, il metodo 'test()' restituisce naturalmente 'false' quando non viene trovata alcuna corrispondenza. –

+1

In realtà, rende molto poco senso (vicino allo zero, direi) usando il modificatore '/ g' sul pattern che deve essere usato in' .test' - a meno che non si voglia effettivamente far avanzare la regex. Ma questo è MOLTO raro, per non dire altro. – raina77ow

Problemi correlati