2010-07-25 4 views
3

Je suis confus:Même fonction JavaScript renvoie des résultats aléatoires

function is_valid(name) { 
    var regexp_name = /^(\d|\w)*$/gi; 
    return regexp_name.test(name); 
} 

// Console 
console.log(is_valid("Test")); 
=> true 

console.log(is_valid("Test")); 
=> false 

console.log(is_valid("Test")); 
=> true 

console.log(is_valid("Test")); 
=> false 

Qu'est-ce que je fais mal?

+0

Je reçois le même résultat que vous dans Firebug. –

+0

même ici. de façon surprenante si vous le testez avec 'console.log (is_valid ("! # "));' il s'avère très bien. et selon des observations prolongées, la valeur retournée alterne entre vrai et faux. – mauris

Répondre

6

Enlever le drapeau /g.

L'objet RegExp est en quelque sorte réutilisé. Lorsque le drapeau /g est présent, le moteur regex démarre à partir de l'emplacement correspondant précédent jusqu'à ce que la chaîne entière soit consommée.

1st call:  Test 
       ^
after 1st call: Test (found "Test") 
        ^
2nd call:  Test 
        ^
after 2nd call Test (found nothing, reset) 
       ^

BTW, \w est équivalent à [0-9a-zA-Z_] en Javascript. Par conséquent, les indicateurs \d| et /i sont redondants. Et puisque vous n'utilisez pas le groupe capturé, il n'est pas nécessaire de conserver le (…). Ce qui suit est suffisant:

var regexp_name = /^\w*$/; 
+0

ouais le supprimer fait fonctionner correctement l'expression rationnelle. – mauris

+3

Ok, mais pourquoi? Que diriez-vous d'une explication? –

+0

Je ne comprends pas pourquoi il ne consomme pas toute la chaîne. La correspondance est à la fin de la chaîne. –

Questions connexes