正则量词{a,b}优先匹配哪个出现次数?实例差异解析
正则量词{1,2}的匹配逻辑与反向引用的影响
一、量词{1,2}的默认匹配规则:贪婪优先
正则里的区间量词{a,b}默认是贪婪模式,也就是优先匹配允许的最大次数(即b次),只有当后续匹配失败时,才会回溯减少匹配次数(尝试a到b-1的次数)。
- 单独使用
#(\w{1,2})时:
不管目标字符串是#000000还是#000,正则都会优先让分组(\w{1,2})匹配最多的2个字符,也就是前两个0,所以分组结果都是00——因为这时候没有后续匹配要求,贪婪匹配的结果直接生效,不需要回溯。
二、添加反向引用后匹配结果变化的原因:回溯机制触发
当正则变成#(\w{1,2})\1\1时,反向引用\1要求后续内容必须和分组捕获的内容完全一致,这就给匹配增加了约束:
匹配
#000000时:
分组先贪婪匹配2个0(即00),后续的\1\1就是00+00,正好和字符串剩下的0000完全匹配,整个正则匹配成功,所以分组结果还是00。匹配
#000时:- 第一步,分组先尝试贪婪匹配2个
0(即00),此时\1\1需要匹配0000,但字符串剩下的只有1个0,匹配失败。 - 触发回溯机制:正则会让分组减少匹配次数,从2次降到1次,此时分组捕获的是
0,\1\1就是0+0,正好和字符串剩下的00匹配,整个正则成功匹配,所以分组结果变成0。
- 第一步,分组先尝试贪婪匹配2个
总结
- 区间量词
{a,b}默认优先匹配最大次数(贪婪); - 反向引用会给匹配增加约束,当贪婪匹配导致后续反向引用无法匹配时,正则会回溯调整分组的匹配次数,直到找到能让整个正则匹配成功的结果。
内容的提问来源于stack exchange,提问作者jleng
相关产品推荐
相关产品推荐

