全局正则表达式混乱
正则表达式中的全局标志 (g) 旨在搜索字符串中模式的所有出现位置,而不仅仅是第一个。但是,当与不区分大小写的标志 (i) 一起使用时,它可能不会产生预期的结果。
问题
考虑以下场景:
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]
原因
问题的出现是因为全局标志使 RegExp 对象跟踪发生匹配的最后一个索引。在后续匹配中,搜索从该索引开始,而不是从 0 开始。这就是上面示例中发生的情况:
console.log(re.lastIndex); // 0 console.log(re.test('Foo Bar')); // true console.log(re.lastIndex); // 6 console.log(re.test('Foo Bar')); // false console.log(re.lastIndex); // 6
如您所见,第二个匹配结果为“false”,因为搜索从索引 6,在第一次测试期间已发生匹配。
解决问题
避免对于这个问题,您可以在匹配之间重置 RegExp 对象的 lastIndex 属性:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); var result = []; result.push(re.test('Foo Bar')); re.lastIndex = 0; // Reset the last index result.push(re.test('Foo Bar')); // result will be [true, true]
以上是为什么具有全局和不区分大小写标志的'RegExp”会返回意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!