I am seriously going crazy over this and I’ve already spent an unproportionate amount of time on trying to figure out what’s going on here. So please give me a hand =)
I need to do some RegExp matching of strings in JavaScript. Unfortunately it behaves very strangely. This 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>");
}
}
Returns "cat" and "dog" for the first two elements, as it should be, but then some exec()-calls start returning null. I don’t understand why.
I posted a Fiddle here, where you can run and edit the code.
And so far I’ve tried this in Chrome and Firefox.
Oh, here it is. Because you’re defining your regex global, it matches first
cat, and on the second pass of the loopdog. So, basically you just need to reset your regex (it’s internal pointer) as well. Cf. this: