提问人:RobbieDixonBr-dge 提问时间:11/10/2023 最后编辑:RobbieDixonBr-dge 更新时间:11/11/2023 访问量:79
如何编写将负面展望与负面展望相结合的正则表达式以创建负面展望?
How do you write a Regex that combines a Negative Lookbehind with a Negative Lookahead to create a Negative Lookaround?
问:
在我们的 Java Selenium 框架中,我们需要编写一个正则表达式,该正则表达式读取任何长度的字符串,如果它包含子字符串 “bar”,则返回 true,只要子字符串 “foo” 没有出现在字符串中,方法是将 Negative Lookbehind 与 Negative Lookahead 相结合。
我能构造的最好的正则表达式是(?<!foo)bar(?!.*foo).*
它正确匹配以下所需的字符串:
bar
,bar,
,,bar,,
barbar
,bar,bar,
,,bar,,bar,,
barbarbar
,bar,bar,bar,
,,bar,,bar,,bar,,
但是,它还匹配以下不需要的字符串:
,foo,bar,
,,foo,,bar,,
foobarbar
,foo,bar,bar,
,,foo,,bar,,bar,,
,bar,foo,bar,
,,bar,,foo,,bar,,
,foo,foo,bar,
,,foo,,foo,,bar,,
我的测试是在这里进行的:https://regex101.com/r/uhdUhU/5
答:
@CAustin和@CarySwoveland提供了正确的答案:^(?!.*foo).*bar
^
在行首处断言位置
(?!.*foo)
是负面展望
.
匹配任何字符(行终止符除外)
*
在零到无限次之间匹配前一个代币,尽可能多地,根据需要回馈(贪婪)
答案已验证: https://regex101.com/r/OzHZ1k/3
评论
这不是我的首选解决方案,但您可以尝试匹配以下正则表达式。
^(?:(?!foo).)*bar(?:(?!foo).)*$
(?:(?!foo).)
匹配任何一个字符,前提是该字符与以下两个字符(如果存在)一起拼写 。该技术被称为“脾气暴躁的贪婪代币解决方案”。"foo"
评论
(?<!foo.{0,1000})bar(?!.*foo)