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

时间:2020-10-17 02:33:35

标签: php regex autohotkey

我编写了此正则表达式以匹配.= 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 :=之前的所有字符串

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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