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

itcoder 阅读:34 2025-02-15 21:57:57 评论:0

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

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

请您参考如下方法:

使用 negative lookahead assertion .

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

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

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

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


声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号