Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript Regex literal with /g used multiple times

Tags:

I have a weird issue working with the Javascript Regexp.exec function. When calling multiple time the function on new (I guess ...) regexp objects, it works one time every two. I don't get why at all!

Here is a little loop example but it does the same thing when used one time in a function and called multiple times.

for (var i = 0; i < 5; ++i) {   console.log(i, (/(b)/g).exec('abc')); }  > 0 ["b", "b"] > 1 null > 2 ["b", "b"] > 3 null > 4 ["b", "b"] 

When removing the /g, it gets back to normal.

for (var i = 0; i < 5; ++i) {   console.log(i, (/(b)/).exec('abc')); }             /* no g ^ */  > 0 ["b", "b"] > 1 ["b", "b"] > 2 ["b", "b"] > 3 ["b", "b"] > 4 ["b", "b"] 

I guess that there is an optimization, saving the regexp object, but it seems strange.

This behaviour is the same on Chrome 4 and Firefox 3.6, however it works as (I) expected in IE8. I believe that is intended but I can't find the logic in there, maybe you will be able to help me!

Thanks

like image 338
Vjeux Avatar asked Jan 26 '10 19:01

Vjeux


1 Answers

If you're going to reuse the same regular expression anyway, take it out of the loop and explicitly reset it:

var pattern = /(b)/g; for (var i = 0; i < 5; ++i) {   pattern.lastIndex = 0;   console.log(i + ' ' + pattern.exec("abc")); } 
like image 116
Pointy Avatar answered Oct 08 '22 19:10

Pointy