带gi修饰符的正则表达式第二次调用返回不同结果是什么原因?
问题原因分析
const reg = new RegExp("c6", 'gi') console.log(reg.test("c6289")); // 输出 true console.log(reg.test("c6289")); // 输出 false
这个现象是带g(全局匹配)标志的正则实例的lastIndex属性导致的:
- 只要正则加了
g标志,所有匹配方法(test、exec等)执行后,都会自动更新正则实例自身的lastIndex属性,记录本次匹配结束位置的下一个下标,作为下一次匹配的起始位置。 - 第一次执行
reg.test("c6289")时,从下标0开始查找,成功匹配到开头的c6,返回true,同时reg.lastIndex被设置为2,代表下一次从下标2开始查找。 - 第二次执行
reg.test("c6289")时,从下标2开始向后查找,剩余的字符串为289,不存在匹配的c6,返回false,同时lastIndex会被重置为0。
解决方案
- 如果不需要全局多次匹配,直接去掉正则的
g标志即可,此时lastIndex不会生效,每次匹配都会从头开始:const reg = new RegExp("c6", 'i') console.log(reg.test("c6289")); // true console.log(reg.test("c6289")); // true - 如果必须保留
g标志,可以在每次调用匹配方法前手动重置lastIndex为0:const reg = new RegExp("c6", 'gi') console.log(reg.test("c6289")); // true reg.lastIndex = 0 console.log(reg.test("c6289")); // true - 每次调用test时新建独立的正则实例,避免共享
lastIndex:console.log(new RegExp("c6", 'gi').test("c6289")); // true console.log(new RegExp("c6", 'gi').test("c6289")); // true
内容的提问来源于stack exchange,提问作者adityasabnis
相关产品推荐
相关产品推荐

