为了账号安全,请及时绑定邮箱和手机立即绑定

为什么带有全局标志的RegExp会产生错误的结果?

为什么带有全局标志的RegExp会产生错误的结果?

为什么带有全局标志的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));


查看完整回答
反对 回复 2019-05-23
?
湖上湖

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'));


查看完整回答
反对 回复 2019-05-23
  • 3 回答
  • 0 关注
  • 675 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信