给定一个输入字符串fooxxxxxxfooxxxboo
我正在尝试编写一个匹配fooxxxboo
的正则表达式,即从第二个foo开始直到最后一个boo。
我尝试了以下
foo.*?boo
匹配完整字符串fooxxxxxxfooxxxboo
foo.*boo
也匹配完整的字符串fooxxxxxxfooxxxboo
我读了这个Greedy vs. Reluctant vs. Possessive Quantifiers并且我理解它们的不同之处,但是我试图匹配与正则表达式匹配的最短字符串,即从后面评估的正则表达式。 有什么方法我只能匹配最后一部分吗?
答案 0 :(得分:3)
使用negative lookahead assertion。
foo(?:(?!foo).)*?boo
(?:(?!foo).)*?
- 任何字符的非贪婪匹配,但不是foo
零次或多次。也就是说,在匹配每个字符之前,它会检查字符是否不是字母f
,后跟两个o
。如果是,那么只匹配相应的字符。
为什么正则表达式foo.*?boo
与完整字符串fooxxxxxxfooxxxboo
匹配?
因为你的正则表达式中的第一个foo
与foo
字符串匹配,而后面的.*?
将匹配字符串boo
,所以我们得到了一个非贪婪的匹配两个匹配fooxxxxxxfooxxxboo
和fooxxxboo
。因为第一场比赛中存在第二场比赛,所以正则表达式引擎仅显示第一场比赛。
答案 1 :(得分:1)