正则表达式在找到字符串时忽略匹配

Regex ignore match when found string

我写了这个正则表达式来匹配 .= 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 上使用正则表达式来匹配 .= = and :=

之前的所有字符串

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

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

这在所需子字符串模式前后使用规范的 Regular expression to match a line that doesn't contain a word,从而拒绝在目标之前或之后带有子字符串 "foo" 的行。

AutoHotKey 参考 regex quick reference

处的 pcre 手册

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

\G(?!.*\bfoo\b)[^.:=\r\n]*(?:[.:](?!=)[^.:=\r\n]*)*\b(\w+)\h*([.:]?=)

说明

  • \G 断言前一场比赛结束时的位置,或者在本例中为字符串的开头
  • (?!.*\bfoo\b) 否定前瞻,断言字符串不包含foo
  • [^.:=\r\n]* 匹配 0+ 次任何字符,除了 . : = 或换行符
  • (?:[.:](?!=)[^.:=\r\n]*)* 如果确实遇到了 .: 只有当它后面没有直接跟着 = 时才匹配它,并重复此 0+ 次以防出现这种情况多次发生
  • \b(\w+) 单词边界,在第 1 组中捕获 1+ 个单词字符
  • \h*([.:]?=) 匹配 0+ 个水平空白字符并在组 2 中捕获 .= :==

Regex demo