正则表达式匹配第一个实例

时间:2018-12-25 05:25:50

标签: regex scala apache-spark

我有一个正则表达式(.*)?start((?!(foo|boo)).)* end test.*

如果在开始结束测试之间没有 foo boo ,它将返回true。 strong>,否则为false。它按预期工作。但我遇到以下表达式

的问题
start foo again start too anything anything end test

我的预期结果是错误的,因为两者之间有foo。但是看起来它并没有占用第一个start

2 个答案:

答案 0 :(得分:2)

考虑使用此模式:

^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)* end test\b.*$

您当前的正则表达式失败的原因是,最初的(.*)?start实际上正在消耗start foo again,因此绕过了负的超前回火点,该点检查fooboo不要出现在两者之间。如果单词不是start,我的方法只会在 开头使用。这样可以使您的逻辑按预期工作,并且我们可以断言fooboo都不会出现在第一个startend test文本之间。

请注意,假设您不想捕获任何内容,我会在几个地方添加单词边界,并使组不捕获。

Demo

答案 1 :(得分:2)

Tim Biegeleisen的答案很好,但是它不接受其中不存在startend test的字符串(例如:abc123应该作为条件 fooboo之间没有startend test )。从您的问题中看不出来是否需要这些字符串。如果这样做,则必须将正则表达式更改为:

 ^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)*\bend test\b.*$|^(?:(?!\bstart\b).)*$|^(?:(?!\bend test\b).)*$

演示: https://regex101.com/r/492Z5m/2/