RegExp.exec() renvoie la valeur NULL de façon sporadique
Je suis sérieux, fou au cours de cette année et j'ai déjà passé un unproportionate montant de temps à essayer de comprendre ce qui se passe ici. Merci donc de me donner un coup de main =)
J'ai besoin de faire quelques RegExp la correspondance de chaînes en JavaScript. Malheureusement, il se comporte très étrangement. Ce code:
var rx = /(cat|dog)/gi;
var w = new Array("I have a cat and a dog too.", "There once was a dog and a cat.", "I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.","I have a cat and a dog too.", "There once was a dog and a cat.");
for (var i in w) {
var m = null;
m = rx.exec(w[i]);
if(m){
document.writeln("<pre>" + i + "\nINPUT: " + w[i] + "\nMATCHES: " + m.slice(1) + "</pre>");
}else{
document.writeln("<pre>" + i + "\n'" + w[i] + "' FAILED.</pre>");
}
}
Renvoie "chat" et "chien" pour les deux premiers éléments, comme il se doit, mais certains exec()
-les appels commencent à retourner null
. Je ne comprends pas pourquoi.
J'ai posté un Violon ici, où vous pouvez l'exécuter et de modifier le code.
Et jusqu'à présent, j'ai essayé sur Chrome et Firefox.
Cheers!
/Christofer
- il ne parvient pas uniquement sur un
"I have a cat and a dog too."
, il semble - exec retourne null si un match ne parvient pas, par conception, si pour une raison quelconque, il ne parvient pas à égaler.
Vous devez vous connecter pour publier un commentaire.
Oh, c'est ici. Parce que vous êtes à la définition de votre regex mondiale, il correspond à la première
cat
, et sur la deuxième phase de la boucledog
. Donc, fondamentalement, vous avez juste besoin de réinitialiser votre regex (c'est le pointeur interne) ainsi. Cf. ce:L'objet regex a une propriété
lastIndex
qui est mis à jour lorsque vous exécutezexec
. Ainsi, lorsque vous executez le regex sur, par exemple, "j'ai un chat et un chien trop.",lastIndex
est fixé à 12. La prochaine fois que vous exécutezexec
sur le même objet regex, il commence à chercher à partir de l'index 12. Donc, vous devez réinitialiser lelastIndex
bien entre chaque exécution.myRe.lastIndex = 0;
pour une utilisation ultérieure.Deux choses:
g
(global) du pavillon. Pour résoudre cela, je recommed il suffit d'attribuer0
à lalastIndex
membre de laRegExp
objet. Ce ont de meilleures performances que de détruire et recréer.in
mot-clé, afin de marcher sur uneArray
l'objet, car peut conduire à des résultats inattendus avec certaines libs. Parfois, vous devriez vérifier avec somethign commeisNaN(i)
, ou si vous savez qu'il n'ont pas de trous, utiliser la boucle for classique.Le code peut être:
J'ai eu un problème similaire, à l'aide de /g seulement, et la solution proposée ici n'a pas de travail pour moi dans FireFox 3.6.8. J'ai obtenu mon script de travail avec
Je suis en ajoutant ce au cas où quelqu'un d'autre a le même problème je l'ai fait avec la solution ci-dessus.