我有一个正则表达式(.*)?start((?!(foo|boo)).)* end test.*
。
如果在开始和结束测试之间没有 foo 或 boo ,它将返回true。 strong>,否则为false。它按预期工作。但我遇到以下表达式
的问题start foo again start too anything anything end test
我的预期结果是错误的,因为两者之间有foo
。但是看起来它并没有占用第一个start
。
答案 0 :(得分:2)
考虑使用此模式:
^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)* end test\b.*$
您当前的正则表达式失败的原因是,最初的(.*)?start
实际上正在消耗start foo again
,因此绕过了负的超前回火点,该点检查foo
和boo
不要出现在两者之间。如果单词不是start
,我的方法只会在 开头使用。这样可以使您的逻辑按预期工作,并且我们可以断言foo
和boo
都不会出现在第一个start
和end test
文本之间。
请注意,假设您不想捕获任何内容,我会在几个地方添加单词边界,并使组不捕获。
答案 1 :(得分:2)
Tim Biegeleisen的答案很好,但是它不接受其中不存在start
和end test
的字符串(例如:abc123
应该作为条件 foo
和boo
之间没有start
或end test
)。从您的问题中看不出来是否需要这些字符串。如果这样做,则必须将正则表达式更改为:
^(?:(?!\bstart\b).)*\bstart\b(?:(?!\b(foo|boo)\b).)*\bend test\b.*$|^(?:(?!\bstart\b).)*$|^(?:(?!\bend test\b).)*$