2015-06-17 10 views
6

Chiunque può spiegarmi, perché la variabile locale Regex variabile e non locale Regex ha un'uscita diversa.Regex.test() sta dando un vero sequenziale falso?

var regex1 = /a|b/g; 
function isAB1() { 
    return regex1.test('a'); 
} 
console.log(isAB1()); // true 
console.log(isAB1()); // false 
console.log(isAB1()); // true 
console.log(isAB1()); // false 


function isAB2() { 
    var regex2 = /a|b/g; 
    return regex2.test('a'); 
} 
console.log(isAB2()); // true 
console.log(isAB2()); // true 
console.log(isAB2()); // true 
console.log(isAB2()); // true 

ho creato un JSFiddle per lo stesso here.

+1

dal [doc] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test): 'chiamato più volte sulla stessa istanza dell'espressione regolare globale verrà avanzare oltre la precedente partita'. – Hacketo

risposta

6

Hai dato alla tua espressione regolare il flag g che significa che corrisponderà globalmente ai risultati. Così facendo hai chiesto esplicitamente alla tua espressione regolare di mantenere lo stato delle sue precedenti corrispondenze.

var regex1 = /a|b/g; 

> regex1.lastIndex 
0 
> regex1.test('a'); 
true 
> regex1.lastIndex 
1 
> regex1.test('a'); 
false 

Se si rimuove il g si ottengono i risultati che ti aspettavi.

È possibile verificare le proprietà delle espressioni .lastIndex per quando è stata eseguita la corrispondenza.

+0

Sì, hai ragione. Regex2 locale viene reinizializzato ogni volta che viene lanciato isAB2, quindi isAB2 restituisce sempre true –

+0

corretto, ogni volta è una regex diversa. –

+1

Ecco un articolo correlato Axel ha scritto http://www.2ality.com/2013/08/regexp-g.html –

Problemi correlati