Regex在找到字符串时忽略匹配项



我写这个Regex是为了匹配.= or = or :=之前的任何字符串

如果在同一行上存在单词foo,那么它与该行中的任何内容都不匹配,我该如何添加?

https://regex101.com/r/tJRoDh/213

(?!.*foo)b(w+)s*(.=|=|:=)

x = foo 
foo x= 
x = foo 
foo text :=
text := x text foo
^ don't match any of these because exist the word foo on the same line
---------------------------------------------
text HELLO:= text text
^ match hello
text x = text 
^ match x
text .= something else y:= color 
^ match text           ^ match y

我正在使用AutoHotkey上的regex来匹配.= = and :=之前的所有字符串

AutoHotKey指的是regex快速引用中的pcre手册

在这种情况下,要获得多个匹配,可以使用G锚点,该锚点断言第一个匹配的字符串开头的上一个匹配末尾的位置。

G(?!.*bfoob)[^.:=rn]*(?:[.:](?!=)[^.:=rn]*)*b(w+)h*([.:]?=)

解释

  • G断言上一个匹配末尾的位置,或者在本例中断言字符串开头的位置
  • (?!.*bfoob)否定前瞻,断言字符串不包含foo
  • [^.:=rn]*匹配除.:=或换行符之外的任何字符的0+倍
  • (?:[.:](?!=)[^.:=rn]*)*如果它确实遇到.:,只有当它没有直接跟在=后面时才匹配它,并重复0+次,以防这种情况发生多次
  • b(w+)字边界,捕获组1中的1个以上字字符
  • h*([.:]?=)匹配0+水平空白字符并在组2中捕获.=:==

Regex演示

以下正则表达式似乎足够了:

^(?:(?!foo).)*b(w+)s*(.=|=|:=)(?:(?!foo).)*$

这使用规范正则表达式来匹配在所需子字符串模式之前和之后不包含单词的行,从而拒绝在目标之前或之后具有子字符串"foo"的行。

最新更新