可能重复:
Why RegExp with global flag in Javascript give wrong results?
我的代码如下,
HTML:
<p id="test"></p>
JavaScript的:
var patt = /h/gi;
var arr = ["", "2Hour", "4Hour", "8Hour", "Next Business Day"];
var test = document.getElementById("test");
for (var i = 0; i < arr.length; i++)
{
if (patt.test(arr[i])) {
test.innerHTML += " " + arr[i];
}
}
但是,得到的输出是2Hour 8Hour
,为什么4小时不是输出的一部分?
我的正则表达式有问题吗?我该如何解决这个问题?
我把它放在fiddle
上
答案 0 :(得分:5)
引用MDN:
与exec(或与exec一起)一样,多次调用 在相同的全局正则表达式实例将超过 上一场比赛。
目前正在发生的事情是:
patt
中的正则表达式测试第二个字符串,在索引1
处找到匹配项,并保留此信息test
时,它会尝试从索引1
中找到匹配项
开始,显然不会产生匹配,因为它有效地测试字符串"our"
0
,允许下一个匹配
找到索引1
的字符串。因此,要解决您的问题,只需在每次迭代时创建一个新实例:
for (var i = 0; i < arr.length; i++)
{
if (/h/gi.test(arr[i])) {
test.innerHTML += " " + arr[i];
}
}
这样可以“清除指针”,并确保正则表达式对于每个被测试的字符串都具有相同的行为。