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


慕标5832272
浏览 677回答 3
3回答

慕妹3242003

您正在使用单个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));

湖上湖

RegExp.prototype.test更新正则表达式的lastIndex属性,以便每个测试将从最后一个测试停止的位置开始。我建议使用,String.prototype.match因为它不更新lastIndex属性:!!'Foo&nbsp;Bar'.match(re);&nbsp;//&nbsp;->&nbsp;true!!'Foo&nbsp;Bar'.match(re);&nbsp;//&nbsp;->&nbsp;true注意:!!将其转换为布尔值,然后反转布尔值,以便反映结果。或者,您可以重置该lastIndex属性:result.push(re.test('Foo&nbsp;Bar'));re.lastIndex&nbsp;=&nbsp;0;result.push(re.test('Foo&nbsp;Bar'));
打开App,查看更多内容
随时随地看视频慕课网APP