我在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对象(例如for循环中的re = new RegExp('\\bcat', 'gi')
),它会按预期工作并返回所有数组项,但是我每一次传球真的不需要这样做。
我对正则表达式不太熟悉 - 这是我的正则表达式的问题吗?我忘了分界符了吗?或者它只是另一个JS怪癖?
答案 0 :(得分:6)
当您在RegExp对象上调用exec
时,它会维护一个lastIndex
属性,该属性包含正则表达式与字符串匹配的上一个索引。下次您尝试使用exec
进行匹配时,即使您使用其他字符串进行搜索,它也只会开始查看索引lastIndex + 1
。
为了防止这种情况,您可以在循环的每次迭代中将re.lastIndex
设置为-1
,或者在创建RegExp时删除全局标记。
答案 1 :(得分:1)
Javascript怪癖。 :P