问题:
使用正则表达式时全局标志(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]
预期结果:[true, true]
解释:
A带有 g 标志的 RegExp 对象维护着 lastIndex 属性,指示最后一个匹配的位置。当重复调用测试方法而不重置lastIndex时,它将从上次使用的索引开始恢复搜索,而不是从0开始。
演示:
var query = 'Foo B'; var re = new RegExp(query, 'gi'); 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
在上面的示例中,第一次调用 test 将 lastIndex 设置为 6。随后,第二次调用从索引 6 恢复搜索,这会导致 false,因为搜索范围为仅限于上一场比赛之后的字符。
以上是为什么 RegExp 的 `test()` 方法会返回带有全局和不区分大小写标志的意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!