从最后的正则表达式中最短的匹配

给定一个输入字符串fooxxxxxxfooxxxboo我想写一个匹配fooxxxboo的正则表达式,即从第二个foo开始直到最后一个boo。

我尝试了以下

foo.*?boo匹配整个字符串fooxxxxxxfooxxxboo

foo.*boo也匹配整个字符串fooxxxxxxfooxxxboo

我读了这个贪婪与不愿意与拥有量词,我了解他们的区别,但我试图匹配最后匹配正则表达式的最短字符串,即类似于从后面评估的正则表达式。 有什么办法可以只匹配最后一部分?


使用负面的前瞻断言。

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

DEMO

(?:(?!foo).)*? -任何字符的非贪婪的比赛,但不是foo零次或多次。 也就是说,每一个字符匹配之前,它会检查字符是不是字母f跟着两个o的。 如果是,那么只有相应的字符会匹配。

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

因为正则表达式中的第一个foo匹配foo字符串和以下内容.*? 将做一个非贪婪的比赛直到字符串boo ,所以我们有两个匹配fooxxxxxxfooxxxboofooxxxboo 。 因为第一场比赛中出现第二场比赛,所以正则表达式引擎只显示第一场比赛。


.*(foo.*?boo)

尝试这个。 抓住捕获即$11

看演示。

https://regex101.com/r/nL5yL3/9

链接地址: http://www.djcxy.com/p/13425.html

上一篇: Shortest match in regex from end

下一篇: Regex quantifiers and character classes