如何用Negative Lookbehind与Negative Lookahead实现Negative Lookaround正则?
正则表达式需求与问题修正
在Java Selenium框架中,需要编写正则表达式实现以下判断:任意长度的字符串必须包含子串"bar",且整个字符串中不能出现子串"foo",要求通过结合**Negative Lookbehind(负向回顾后发断言)与Negative Lookahead(负向预查断言)**实现Negative Lookaround。
原正则的匹配情况
我构造的正则为 (?<!foo)bar(?!.*foo).*,该正则能正确匹配以下符合要求的字符串:
bar,bar,,,bar,,barbar,bar,bar,,,bar,,bar,,barbarbar,bar,bar,bar,,,bar,,bar,,bar,,
但该正则存在错误匹配,会将以下包含"foo"的不符合要求的字符串误判为匹配:
,foo,bar,,,foo,,bar,,foobarbar,foo,bar,bar,,,foo,,bar,,bar,,,bar,foo,bar,,,bar,,foo,,bar,,,foo,foo,bar,,,foo,,foo,,bar,,
问题分析
原正则仅对匹配到的单个"bar"做了局部前后检查——确保当前"bar"前面不是"foo"、后面没有"foo",但未对整个字符串是否存在"foo"做全局校验,因此只要字符串中存在一个"bar"满足自身前后无"foo",即使其他位置有"foo",也会被误匹配。
符合要求的正则表达式
^(?!.*foo).*(?<!foo)bar.*$
正则解释
^(?!.*foo):负向预查断言(Negative Lookahead),从字符串起始位置全局校验,确保整个字符串中不存在"foo"子串.*(?<!foo)bar:匹配任意字符后,定位一个**前面不是"foo"**的"bar"(负向回顾后发断言(?<!foo)),满足两种Negative Lookaround结合的要求.*$:匹配"bar"之后的所有剩余字符
内容的提问来源于stack exchange,提问作者RobbieDixonBr-dge
相关产品推荐
相关产品推荐

