为什么用于匹配数字的正则表达式无法命中测试用例中的99?
问题原因
问题出在正则中(?:\b|[,]\d{1,3})的分支判断,以及单词边界\b的匹配逻辑:
- 单词边界
\b的匹配规则是\w类字符和非\w类字符之间的位置,而\w本身包含英文字母、数字、下划线,因此数字和英文字母(比如测试用例中的s)都属于\w类,二者相邻的位置不会被识别为单词边界。 - 带逗号的测试用例
100,00stk、10,45stk都走了[,]\d{1,3}分支,直接匹配到逗号加小数部分,不需要满足单词边界要求,所以可以正常命中;而99stk中的99没有小数部分,只能走\b分支,但9后面紧跟的s是\w类字符,不存在单词边界,因此匹配失败。
修复方案
将正则里的(?:\b|[,]\d{1,3})调整为(?:[,]\d{1,3}|(?![\d]))即可,用负向前瞻判断后续无数字,代替单词边界的判断,即可适配数字后紧跟字母的场景。
内容的提问来源于stack exchange,提问作者clarkk
相关产品推荐
相关产品推荐

