最终的正则表达式最短匹配

时间:2014-12-10 08:56:04

标签: regex regex-greedy

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

我尝试了以下

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

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

我读了这个Greedy vs. Reluctant vs. Possessive Quantifiers并且我理解它们的不同之处,但是我试图匹配与正则表达式匹配的最短字符串,即从后面评估的正则表达式。 有什么方法我只能匹配最后一部分吗?

2 个答案:

答案 0 :(得分:3)

使用negative lookahead assertion

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

DEMO

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

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

因为你的正则表达式中的第一个foofoo字符串匹配,而后面的.*?将匹配字符串boo,所以我们得到了一个非贪婪的匹配两个匹配fooxxxxxxfooxxxboofooxxxboo。因为第一场比赛中存在第二场比赛,所以正则表达式引擎仅显示第一场比赛。

答案 1 :(得分:1)

.*(foo.*?boo)

试试这个。获取捕获,即$1\1

参见演示。

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