Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript RegExp的有趣测试_Javascript_Regex - Fatal编程技术网

Javascript RegExp的有趣测试

Javascript RegExp的有趣测试,javascript,regex,Javascript,Regex,我编写了一个Javascript RegExp测试来检测日期字符串格式,我错误地添加了一个冗余的“g”标志,并发现了一些有趣的东西 var s=“2009/03/10”; var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g; 警报(正则表达式测试); 警报(正则表达式测试); 警报(正则表达式测试); 警报(正则表达式测试); 我得到了一个“真”,后面跟着一个“假”,然后是另一个“真”,然后是另一个“假” 如果我使用一个循环来执行它,我发现了一些更有趣的东西,我在IE和S

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

var s=“2009/03/10”;
var regex=/^\d{4}[/]\d{2}[/]\d{2}$/g;
警报(正则表达式测试);
警报(正则表达式测试);
警报(正则表达式测试);
警报(正则表达式测试);
我得到了一个“真”,后面跟着一个“假”,然后是另一个“真”,然后是另一个“假”

如果我使用一个循环来执行它,我发现了一些更有趣的东西,我在IE和Safari中得到了四个“真”,在FF和Chrome中得到了真、假、真、假


for(var i=0;i在JS RegExp上使用全局标志时,“test”和“exec”方法在第一次匹配时停止,但保留一个指向它们在字符串中停止搜索的位置的指针。可以在
lastIndex
属性上检查该指针。当调用“test”或“exec”时它再次开始搜索从
lastIndex
开始的匹配项

因此,当您在与整个字符串匹配的字符串上测试RegExp时,lastIndex设置为字符串的结尾。下次测试时,它从字符串的结尾开始,返回
false
,并将
lastIndex
设置回零


MDC对这种行为有一个定义。

为了避免这种奇怪的行为,不要使用全局(g)标志

此代码应输出:“True”、“True”、“True”、“True”

var s=“2009/03/10”;
var regex=/^\d{4}[/]\d{2}[/]\d{2}$/i;
警报(正则表达式测试);
警报(正则表达式测试);
警报(正则表达式测试);
警报(正则表达式测试);
全局(g)平面设置属性RegExp.lastIndex。因此,每个测试()都将从最后一个测试停止的位置开始


有关更多信息,请参阅有关

的文档非常感谢,MDC的解释非常清楚。+1感谢您的帮助,在每次测试之前设置reg.lastIndex=0解决了我的问题。例如,如果这导致循环中出现问题,您似乎可以在每次测试之前设置lastIndex=0。但是如果我想要g标志呢?例如,重用同一个rege字符串中的x。replace(regex,replacement)函数?不带“g”,它只替换第一次出现的。