正则表达式中最短的匹配结束

Sri*_*ath 7 regex regex-greedy

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

我尝试了以下

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

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

我读了这篇Greedy vs. Reluctant vs. Possessive Quantifiers并且我理解它们的区别,但我试图从匹配正则表达式的末尾匹配最短的字符串,即类似于要从后面评估的正则表达式。有什么办法可以只匹配最后一部分?

Avi*_*Raj 8

使用否定前瞻断言

foo(?:(?!foo).)*?boo
Run Code Online (Sandbox Code Playgroud)

演示

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

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

因为foo您的正则表达式中的第一个匹配两个foo字符串,而下面的.*?将对字符串进行非贪婪匹配boo,所以我们有两个匹配项fooxxxxxxfooxxxboofooxxxboo。由于第一个匹配项中存在第二个匹配项,因此正则表达式引擎仅显示第一个匹配项。