使用场景
我想要搜索一个字符串以获取多个匹配项。每个匹配项最终都与对象数组中的一个属性链接。当找到一个匹配时,该匹配将被对象内另一个属性替换。问题在于,代码始终会在第二个匹配项上返回 null。
测试用例
这是我正在使用的测试用例。为了简化问题,我只将所有匹配项替换为数字5,但请注意,最终代码将用变量值替换匹配项。
测试代码
下面是我用来测试和调试问题的代码。有趣的是,如果我更改 var str = '5 + QUESTION_2'
,QUESTION_2
就会成功替换为 5。本质上,问题归结为第二个匹配项始终返回 null,尽管它能够匹配。
var re = /( |^)(QUESTION_1|QUESTION_2|QUESTION_3)( |$)/g;
var str = 'QUESTION_1 + QUESTION_2';
var rep = 5;
matches = re.exec(str);
var re2 = new RegExp("( |^)(" + matches[2] + ")( |$)", "g");
console.log(matches); // Returns a match on QUESTION_1
str = str.replace(re2, rep);
console.log(str); // Returns 5+ QUESTION_2
matches = re.exec(str);
console.log(matches); // Returns a match on NULL - doesn't find QUESTION_2
re2 = new RegExp("( |^)(" + matches[2] + ")( |$)", "g");
str = str.replace(re2, rep);
console.log(str); // Returns 5+ QUESTION_2
问题
- 为什么第二个匹配总是 null?
- jsfiddle 在此处可用。
lastIndex
。 - plalx