Perl正则最早优先与贪婪匹配优先级矛盾问题咨询
问题原因说明
你对书中提到的「最早完成匹配」规则存在理解偏差,该规则的准确含义是正则引擎会优先选择「匹配起始位置最靠左」的结果,而非优先选择「结束位置最早」的短匹配,这条规则的优先级确实高于贪婪/懒惰匹配规则。
贪婪/懒惰匹配规则的生效前提是「固定在同一个起始位置尝试匹配」,仅用于决定该起始位置下匹配的长度,优先级低于最左起始位置规则。
你的测试用例执行逻辑拆解
字符串为:fred xxxxxxx barney,正则为/(.*x)/
- 正则引擎从字符串第0位(字符
f的位置)开始尝试匹配 - 因为
.*是贪婪量词,会先吞入整个字符串,再从末尾向前回溯查找字符x,找到最后一个x的位置后匹配成立 - 由于在最靠左的第0位已经匹配到了合法结果,引擎直接返回该结果,不会再向后挪动起始位置尝试匹配
你提到的实际运行得到red xxxxxxx不符合Perl正则的默认行为,大概率是测试代码存在上下文问题,比如正则额外添加了起始偏移限制、或者变量赋值有误,可以单独打印捕获组$1的内容确认实际匹配结果。
补充验证
如果你希望得到fred x的匹配结果,只需要将贪婪量词替换为懒惰量词即可:/(.*?x)/,该写法在第0位起始的前提下,会尽量少匹配字符,找到第一个x就停止,最终返回结果就是fred x,整个过程同样符合「最左起始位置优先」的规则。
内容的提问来源于stack exchange,提问作者user2925716
相关产品推荐
相关产品推荐

