为什么带有全局标志的RegExp会产生错误的结果?当我使用全局标志和不区分大小写的标志时,这个正则表达式有什么问题?查询是用户生成的输入。结果应该是[true,true]。var query = 'Foo B';var re = new RegExp(query, 'gi');var result = [];result.push(re.test('Foo Bar'));result.push(re.test('Foo Bar'));// result will be [true, false]var reg = /^a$/g;for(i = 0; i++ < 10;) console.log(reg.test("a"));
3 回答
慕妹3242003
TA贡献1824条经验 获得超6个赞
您正在使用单个RegExp对象并多次执行它。在每次连续执行时,它从最后一个匹配索引继续。
您需要“重置”正则表达式,以便在每次执行之前从头开始:
result.push(re.test('Foo Bar'));
re.lastIndex = 0;
result.push(re.test('Foo Bar'));
// result is now [true, true]
已经说过每次创建一个新的RegExp对象可能更具可读性(无论如何,由于RegExp被缓存,开销很小):
result.push((/Foo B/gi).test(stringA));
result.push((/Foo B/gi).test(stringB));
湖上湖
TA贡献2003条经验 获得超2个赞
RegExp.prototype.test
更新正则表达式的lastIndex
属性,以便每个测试将从最后一个测试停止的位置开始。我建议使用,String.prototype.match
因为它不更新lastIndex
属性:
!!'Foo Bar'.match(re); // -> true!!'Foo Bar'.match(re); // -> true
注意:!!
将其转换为布尔值,然后反转布尔值,以便反映结果。
或者,您可以重置该lastIndex
属性:
result.push(re.test('Foo Bar'));re.lastIndex = 0;result.push(re.test('Foo Bar'));
添加回答
举报
0/150
提交
取消