正则匹配2-3位数字时如何优先匹配最长的3位数字
问题原因
原有正则匹配失效的核心原因有两点:
\w的匹配范围包含数字(等价于[a-zA-Z0-9_]),并非仅匹配字母- 正则贪婪匹配遵循左优先规则,左侧的
\w*会尽可能多地匹配字符,直到刚好剩余2个数字满足\d{2,3}的最低匹配长度要求。在测试串AAA2AA123A中,开头的\w*会把123的首位1纳入匹配范围,仅给捕获组留下23,导致匹配结果不全。
修正方案
使用负向环视做数字边界,保证匹配到的是独立、长度刚好为2或3位的连续数字串,不会被前后数字截断,正则如下:
(?<!\d)\d{2,3}(?!\d)
规则说明
(?<!\d):负向后行断言,约束待匹配数字串的前一个位置不能是数字\d{2,3}:匹配连续2-3位数字(?!\d):负向前行断言,约束待匹配数字串的后一个位置不能是数字
匹配效果
- 对测试串
AAA1AAA12A:自动跳过单独的1位数字1,精准匹配目标12 - 对测试串
AAA2AA123A:不会截断3位连续数字,完整匹配目标123
如果确定每个字符串有且仅有一串符合要求的2-3位连续数字,也可以用整串匹配写法,匹配结果在第一个捕获组中:
^.*?(?<!\d)(\d{2,3})(?!\d).*$
内容的提问来源于stack exchange,提问作者miguello
相关产品推荐
相关产品推荐

