我一直在调试这个应用程序一段时间,它引导我进入这个测试用例。当我在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
这里发生了什么?
答案 0 :(得分:4)
g
标志表示在第一次匹配后,第二次搜索从匹配的子字符串的末尾开始(即,在字符串的末尾),并且失败,将开始位置重置为开头字符串。
如果正则表达式使用“
g
”标志,则可以多次使用exec
方法在同一字符串中查找连续匹配项。执行此操作时,搜索从正则表达式str
属性指定的lastIndex
子字符串开始(test
也将提升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