4

我在 JS 中看到 RegExp 对象的一些奇怪行为。我正在尝试将查询字符串与搜索自动完成功能的单词开头进行匹配。在遍历名称数组并返回匹配项时,正则表达式仅命中所有其他预期匹配项。

var words = [
                "catherine",
                "caterpillar", 
                "nice catch", 
                "fat cat", 
                "catalina"
            ],
            re = new RegExp('\\bcat', 'gi'),
            matches = [],
            results, i;

for (i=0; i<words.length; i++) {
    if (re.exec(words[i])) {
        matches.push(words[i]);
    }
}

console.log(matches);

此代码返回["catherine", "nice catch", "catalina"]. 无论元素的顺序如何,行为都是相同的。如果我在每次迭代中重新创建这个 RegExp 对象(例如re = new RegExp('\\bcat', 'gi')在 for 循环内),它会按预期工作并返回所有数组项,但我真的宁愿不每次通过都必须这样做。

我对正则表达式不太熟悉 - 这是我的正则表达式的问题吗?我忘记了分隔符还是什么?或者它只是另一个 JS 怪癖?

4

2 回答 2

7

当您调用execRegExp 对象时,它会维护一个lastIndex属性,该属性包含您的正则表达式匹配字符串的先前索引。下次您尝试使用exec它进行匹配时,只会开始查看 index lastIndex + 1,即使您正在搜索不同的字符串。

为了防止这种情况,您可以在循环的每次迭代中设置re.lastIndex-1,或者在创建 RegExp 时删除全局标志。

于 2012-08-21T18:23:01.393 回答
1

Javascript 怪癖。:P

http://www.w3schools.com/jsref/jsref_regexp_g.asp

于 2012-08-21T18:19:01.537 回答