正则表达式中从结尾开始的最短匹配

7
给定一个输入字符串 fooxxxxxxfooxxxboo,我想编写一个正则表达式来匹配 fooxxxboo,即从第二个 foo 到最后一个 boo 。
我尝试过以下正则表达式: foo.*?boo 匹配整个字符串 fooxxxxxxfooxxxboo foo.*boo 也匹配整个字符串 fooxxxxxxfooxxxboo 我阅读了 贪婪、懒惰和占有量词,并理解它们的差异,但我正在尝试匹配与正则表达式相匹配的最短字符串,即从后面开始评估正则表达式的东西。有没有办法只匹配最后一部分?
2个回答

10

使用负向先行断言

foo(?:(?!foo).)*?boo

DEMO

(?:(?!foo).)*? - 非贪婪地匹配除了 foo 之外的任何字符,零次或多次。也就是说,在匹配每个字符之前,它会检查该字符是否不是字母 f 后跟两个 o。如果是,则只匹配对应的字符。

为什么正则表达式 foo.*?boo 匹配完整字符串 fooxxxxxxfooxxxboo

因为你的正则表达式中的第一个 foo 匹配了两个 foo 字符串,接下来的 .*? 进行非贪婪匹配直到遇到 boo 字符串,所以我们得到了两个匹配结果 fooxxxxxxfooxxxboofooxxxboo。因为第二个匹配结果包含在第一个匹配结果中,正则引擎仅显示第一个匹配结果。


2

越易懂,越高效。 - bobble bubble

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接