firefox 3.6.20正则表达式给出不一致的结果

时间:2011-08-24 16:58:56

标签: javascript regex firefox3.6

我一直在调试这个应用程序一段时间,它引导我进入这个测试用例。当我在firefox 3.6.x中运行它时,它只能在50%的时间内运行。

var success = 0;

var pat = /(\d{2})\/(\d{2})\/(\d{4})\s(\d{2}):(\d{2})\s(am|pm)/g;
var date = "08/01/2011 12:00 am";

for(var i=0;i<100;i++) if(pat.exec(date)) success++;
alert("success: " + success + " failed: " + (100 - success));

它提醒success: 50 failed: 50

这里发生了什么?

2 个答案:

答案 0 :(得分:4)

g标志表示在第一次匹配后,第二次搜索从匹配的子字符串的末尾开始(即,在字符串的末尾),并且失败,将开始位置重置为开头字符串。

  

如果正则表达式使用“g”标志,则可以多次使用exec方法在同一字符串中查找连续匹配项。执行此操作时,搜索从正则表达式str属性指定的lastIndex子字符串开始(test也将提升lastIndex属性)。

from MDC docs for RexExp.exec()。 (另见RegExp.lastIndex

答案 1 :(得分:2)

您正在使用全局标志。因此,正则表达式仅与特定索引匹配。每次匹配后,pat.lastIndex == 19,然后pat.lastIndex == 0

一个更简单的例子:

var r = /\d/g;
r.exec("123"); // 1 - lastIndex == 0, so matching from index 0 and on
r.exec("123"); // 2 - lastIndex == 1, ditto with 1
r.exec("123"); // 3 - lastIndex == 2, ditto with 2
r.exec("123"); // null - lastIndex == 3, no matches, lastIndex is getting reset
r.exec("123"); // 1 - start all over again