从最后的正则表达式中最短的匹配
给定一个输入字符串fooxxxxxxfooxxxboo
我想写一个匹配fooxxxboo
的正则表达式,即从第二个foo开始直到最后一个boo。
我尝试了以下
foo.*?boo
匹配整个字符串fooxxxxxxfooxxxboo
foo.*boo
也匹配整个字符串fooxxxxxxfooxxxboo
我读了这个贪婪与不愿意与拥有量词,我了解他们的区别,但我试图匹配最后匹配正则表达式的最短字符串,即类似于从后面评估的正则表达式。 有什么办法可以只匹配最后一部分?
使用负面的前瞻断言。
foo(?:(?!foo).)*?boo
DEMO
(?:(?!foo).)*?
-任何字符的非贪婪的比赛,但不是foo
零次或多次。 也就是说,每一个字符匹配之前,它会检查字符是不是字母f
跟着两个o
的。 如果是,那么只有相应的字符会匹配。
为什么正则表达式foo.*?boo
匹配整个字符串fooxxxxxxfooxxxboo
?
因为正则表达式中的第一个foo
匹配foo
字符串和以下内容.*?
将做一个非贪婪的比赛直到字符串boo
,所以我们有两个匹配fooxxxxxxfooxxxboo
和fooxxxboo
。 因为第一场比赛中出现第二场比赛,所以正则表达式引擎只显示第一场比赛。
.*(foo.*?boo)
尝试这个。 抓住捕获即$1
或1
。
看演示。
https://regex101.com/r/nL5yL3/9
链接地址: http://www.djcxy.com/p/13425.html