JS正则表达式跳过每隔一个匹配

JS regex skips every other match

本文关键字:一个 正则表达式 JS      更新时间:2023-09-26

我看到JS中的RegExp对象有一些奇怪的行为。我正在尝试将查询字符串与搜索自动完成函数的单词开头进行匹配。当迭代一个名称数组并返回匹配项时,regex只会命中其他所有期望的匹配项。

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对象(例如for循环中的re = new RegExp('''bcat', 'gi')),它会按预期工作并返回所有数组项,但我真的不想每次都这样做。

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

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

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

Javascript怪癖:P

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

相关文章: