admin管理员组文章数量:1400681
I'm seeing some strange behavior with a RegExp object in JS. I'm attempting to match a query string against the beginnings of words for a search autoplete function. While iterating over an array of names and returning the matches, the regex only hits on every other expected match.
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);
This code returns ["catherine", "nice catch", "catalina"]
. Behavior is the same no matter what order the elements are in. If I re-create this RegExp object in every iteration (e.g. re = new RegExp('\\bcat', 'gi')
inside the for loop), it works as expected and returns all the array items, but I'd really rather not have to do that for every pass.
I'm not too familiar with regular expressions - is this a problem with my regex? Did I forget a delimiter or something? Or is it just another JS quirk?
I'm seeing some strange behavior with a RegExp object in JS. I'm attempting to match a query string against the beginnings of words for a search autoplete function. While iterating over an array of names and returning the matches, the regex only hits on every other expected match.
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);
This code returns ["catherine", "nice catch", "catalina"]
. Behavior is the same no matter what order the elements are in. If I re-create this RegExp object in every iteration (e.g. re = new RegExp('\\bcat', 'gi')
inside the for loop), it works as expected and returns all the array items, but I'd really rather not have to do that for every pass.
I'm not too familiar with regular expressions - is this a problem with my regex? Did I forget a delimiter or something? Or is it just another JS quirk?
Share Improve this question asked Aug 21, 2012 at 18:15 arizzitanoarizzitano 1821 silver badge8 bronze badges2 Answers
Reset to default 10When you call exec
on a RegExp object it maintains a lastIndex
property that contains the previous index at which your regex matched the string. The next time you attempt to match using exec
it will only start looking at index lastIndex + 1
, even if you are searching in a different string.
To prevent this, you can set re.lastIndex
to -1
on each iteration of the loop, or just drop the global flag when creating the RegExp.
Javascript quirk. :P
http://www.w3schools./jsref/jsref_regexp_g.asp
本文标签: javascriptJS regex skips every other matchStack Overflow
版权声明:本文标题:javascript - JS regex skips every other match - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744250542a2597229.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论