2010-04-19 1 views
4

J'ai ce comportement dans Chrome (Developer Tools) et Firefox (Firebug). Notez les déclarations de test regex valeurs vrai/faux en alternance:Le test d'expression régulière ne peut pas décider entre vrai et faux (JavaScript)

> var re = /.*?\bbl.*\bgr.*/gi; 
undefined 
> re 
/.*?\\bbl.*\\bgr.*/gi 
> re.test("Blue-Green"); 
true 
> re.test("Blue-Green"); 
false 
> re.test("Blue-Green"); 
true 
> re.test("Blue-Green"); 
false 

Cependant, le test de la même regex comme littéral:

> /.*?\bbl.*\bgr.*/gi.test("Blue-Green"); 
true 
> /.*?\bbl.*\bgr.*/gi.test("Blue-Green"); 
true 
> /.*?\bbl.*\bgr.*/gi.test("Blue-Green"); 
true 
> /.*?\bbl.*\bgr.*/gi.test("Blue-Green"); 
true 

Je ne peux pas expliquer cela et cela rend le débogage très difficile. Quelqu'un peut-il expliquer ce comportement?

+0

Funky. Reproduit avec Firefox 3.5.8 et Firebug 1.5.3. Se produit toujours si "Bleu-Vert" est stocké dans une variable et réutilisé. – Darien

+0

J'ai trouvé cela légèrement amusant. Au lieu d'utiliser 'a =! A' pour basculer entre true/false, pourquoi ne pas définir un objet regexp privé et utiliser' regexp.test! ' – Warty

+0

Idem dans Opera-10.52_pre6317 – ZyX

Répondre

9

/g (global) regexps fera cela, oui.

Voir this question. Lorsque vous écrivez un littéral, vous obtenez à chaque fois un nouvel objet regexp, perdant ainsi l'état lastIndex associé à l'ancien objet.

+0

Cela n'a aucun sens, mais OK! –

+0

Rien sur l'interface JavaScript 'RegExp' n'a de sens! Le WTF réel est les propriétés de l'objet constructeur 'RegExp' global reflétant la dernière correspondance ... ugh. – bobince

Questions connexes