javascript中奇怪的正则表达式行为

时间:2012-12-06 10:42:44

标签: javascript regex

  

可能重复:
  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

1 个答案:

答案 0 :(得分:5)

引用MDN:

  

与exec(或与exec一起)一样,多次调用   在相同的全局正则表达式实例将超过   上一场比赛。

目前正在发生的事情是:

  1. 存储在patt中的正则表达式测试第二个字符串,在索引1处找到匹配项,并保留此信息
  2. 下次使用test时,它会尝试从索引1中找到匹配项 开始,显然不会产生匹配,因为它有效地测试字符串"our"
  3. 这会将指针重置为0,允许下一个匹配 找到索引1的字符串。
  4. 因此,要解决您的问题,只需在每次迭代时创建一个新实例:

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

    这样可以“清除指针”,并确保正则表达式对于每个被测试的字符串都具有相同的行为。

    以下是演示:http://jsfiddle.net/QbXEX/12/