0

可能重复:
为什么在 Javascript 中带有全局标志的 RegExp 会给出错误的结果?

我的代码如下,

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,为什么 4Hour 不是输出的一部分?

我的正则表达式有问题吗?我该如何解决这个问题?

我把它放在小提琴上

​</p>

4

1 回答 1

5

引用 MDN:

与 exec (或与它结合使用)一样,在同一个全局正则表达式实例上多次调用 test将超过上一次匹配。

目前正在发生的事情是:

  1. 存储在中的正则表达式patt测试第二个字符串,在索引处找到匹配项1,并保留此信息
  2. 下次使用test它时,会尝试从索引1 开始查找匹配项,这显然不会产生匹配项,因为它正在有效地测试字符串"our"
  3. 这会将指针重置为0,从而允许在 index 处的下一个字符串中1找到匹配项。

因此,要解决您的问题,只需在每次迭代中创建一个新实例:

for (var i = 0; i < arr.length; i++)
{
    if (/h/gi.test(arr[i])) {
        test.innerHTML += " " + arr[i];
    }
}

这就像“清除指针”一样,并确保正则表达式对于它所测试的每个字符串的行为都是相同的。

这是一个演示:http: //jsfiddle.net/QbXEX/12/

于 2012-12-06T10:56:13.103 回答