为何正则表达式的单词边界\b不匹配空白字符?
JavaScript中
\b的误解与测试结果解析 首先纠正你的核心误解:\b不是匹配空白字符,它表示的是单词边界——即单词字符(\w,对应字母、数字、下划线)和非单词字符(\W,除\w外的所有字符)之间的位置,或者字符串开头/结尾与单词字符的衔接位置。
接下来拆解你的测试结果:
第一次测试
r.test('RECURRING')返回true
字符串RECURRING本身就是完整的单词,开头是单词字符R,结尾是单词字符G,\b正好匹配字符串开头和结尾的单词边界,加上i标志忽略大小写,完全匹配正则/\brecurring\b/ig,所以返回true。第二次测试
r.test('XXX RECURRING')返回false
问题出在正则的g(全局)标志上:当使用全局正则调用test()时,正则实例会维护一个lastIndex属性,记录下一次匹配的起始位置。第一次test()成功匹配后,lastIndex被设置为匹配结果的结束位置(即第一个字符串RECURRING的末尾,索引9)。第二次调用test()时,会从lastIndex=9的位置开始在XXX RECURRING中查找,而这个位置对应的是字符串里RECURRING的第6个字符(XXX占了前4个索引,RECURRING从索引4开始,索引9是第6个字符R),剩下的子串无法匹配完整的\brecurring\b,所以返回false。
如果想让第二次测试正常匹配,有两种解决方式:
- 去掉
g标志(你不需要全局匹配,只是验证是否存在该单词):
r = /\brecurring\b/i r.test('RECURRING') // true r.test('XXX RECURRING') // true
- 每次测试前手动重置
lastIndex为0:
r = /\brecurring\b/ig r.test('RECURRING') // true r.lastIndex = 0 r.test('XXX RECURRING') // true
内容的提问来源于stack exchange,提问作者James Ko
相关产品推荐
相关产品推荐

