RegEx结合了“匹配一切”和“负向超前”

时间:2019-04-27 14:51:32

标签: regex pcre regex-lookarounds

我正在尝试将字符串“ this”与除“ notthis”以外的其他任何字符(任意数量的字符)进行匹配。

正则表达式:^this.*(?!notthis)$

匹配项:thisnotthis

为什么?

即使它在regex calculator中的解释似乎也应该起作用。解释部分说

  

负前瞻(?!notthis)

     

声明以下正则表达式不匹配

     

notthis从字面上匹配notthis字符(区分大小写)

2 个答案:

答案 0 :(得分:2)

否定前瞻对^this.*(?!notthis)$没有影响,因为.*将首先匹配直到字符串的末尾,而notthis的末尾不再存在。

我认为您的意思是^this(?!notthis).*$,您要从字符串的开头匹配this,然后检查右边notthis

右边是什么。

在这种情况下,请匹配除换行符之外的任何字符,直到字符串结尾。

^this(?!notthis).*$

图案的细节

  • ^声明字符串的开头
  • this从字面上匹配this
  • (?! notthis)Assert what is directly on the right is not notthis`
  • .*匹配除换行符外的任意字符0+次
  • $声明字符串的结尾

Regex demo

如果notthis不能出现在字符串中,而不能直接出现在this之后,则可以将.*添加到否定的lookahead中:

^this(?!.*notthis).*$
        ^^

Regex demo

regulex视觉形式观看

enter image description here

答案 1 :(得分:0)

由于规则的顺序。在表达式无法否定前,先满足规则之前,没有什么可匹配的了。

如果您希望匹配 this 之后的所有内容(除了 notthis 以外的其他内容,this RegEx可能也可以帮助您完成此操作:

^this([\s\S]*?)(notthis|())$

它将创建一个没有任何内容的空组(),并使用OR忽略notthis

^this([\s\S]*?)(notthis|())$

enter image description here

您可能会删除() ^ $ ,但仍然可以使用:

this([\s\S]*?)(notthis|)