有趣的Javascript RegExp测试

Dar*_*ead 8 javascript regex

我写了一个Javascript RegExp测试来检测日期字符串格式,我错误地添加了一个冗余的"g"标志,发现了一些有趣的东西.

var s = "2009/03/10";
var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g;
alert(regex.test(s));
alert(regex.test(s));
alert(regex.test(s));
alert(regex.test(s));
Run Code Online (Sandbox Code Playgroud)

我得到一个'true'后跟一个'false',然后是另一个'true',然后是另一个'false'.

如果我使用循环来执行它,我发现更有趣的东西,我在IE和Safari中有四个"真实",在FF,Chrome中有真,假,真,假.

for (var i=0; i<4; i++)
{
  var s = "2009/03/10";
  var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g;
  alert(regex.test(s));
}
Run Code Online (Sandbox Code Playgroud)

有没有人有想法解释为什么Javascript正则表达式会像这样,以及导致浏览器返回不同结果的原因是什么?(与变量声明和生命范围有关?)

Pre*_*aul 20

当你在JS RegExp上使用全局标志时,"test"和"exec"方法在第一次匹配时都会停止,但保留一个指向它们停止在字符串中搜索的位置的指针.可以在lastIndex属性上检查该指针.当你再次打电话给"test"或"exec"时,它会开始搜索从该处开始的匹配lastIndex.

因此,当您在匹配整个字符串的字符串上测试RegExp时,lastIndex将设置为字符串的结尾.下次测试时,从字符串末尾开始,返回falselastIndex重新设置为零.

MDC 对此行为有一个很好的解释.