导出函数中RegExp.test()交替返回true/false问题求助
为什么RegExp的test()重复调用同一值会交替返回true/false?
嘿,这个问题我之前也踩过坑!核心原因就是你给正则加了g(全局匹配)标志,而带有这个标志的正则对象会偷偷维护一个叫lastIndex的属性——它会记录下一次匹配开始的位置,这就是导致结果交替的罪魁祸首。
具体原因拆解
看你定义的正则:
new RegExp( /(?<!\w)(nu?m?e?r?[oi]?)\b/, 'gi' )
第一次调用test("numeri")时,正则从字符串开头(lastIndex=0)开始匹配,成功找到目标,此时lastIndex会被更新到匹配结果的末尾位置(也就是整个字符串的长度,这里是6)。
第二次调用时,正则从lastIndex=6的位置开始匹配,这已经到了字符串的末尾,自然匹配失败,同时lastIndex会自动重置为0。
第三次调用又从0开始,匹配成功,lastIndex再次被设为6……如此循环,就出现了true false true false的交替结果。
两种解决办法
根据你的需求选一种就行:
- 去掉
g标志:如果你的场景只是要检查字符串是否包含目标内容,不需要找出所有匹配项,那完全没必要用全局匹配。修改后的正则:regex: new RegExp( /(?<!\w)(nu?m?e?r?[oi]?)\b/, 'i' ) - 手动重置
lastIndex:如果后续需要用到全局匹配的功能,那就在每次调用test()之前把lastIndex重置为0,确保每次都从字符串开头开始匹配:attivati: function attivati(digitato) { intentTags[0].regex.lastIndex = 0; return intentTags[0].regex.test( digitato ) }
测试效果
修改后再运行你的测试代码,就能得到你预期的结果:
numeri returns: true true true true true true
内容的提问来源于stack exchange,提问作者Claudio Postinghel
相关产品推荐
相关产品推荐

