匹配中没有特定单词的多行正则表达式匹配模式

Regex matching pattern in multiple lines without specific word in the match

我想在多行中匹配以下模式

  1. 模式开始于“PAT_A”
  2. 模式以第一个“;”结尾在“PAT_A”
  3. 之后
  4. 模式在“PAT_A”和“;”之间包含“PAT_B”
  5. 模式在“PAT_A”和“;”之间不包含“NOT_MATCH_THIS”;

例如,这应该匹配

PAT_A_YYY(
  OK,
  PAT_B
);

这不应该匹配。

PAT_A_XXX(
  NOT_MATCH_THIS,
  PAT_B
);

我设法满足了前三个要求

(PAT_A[^;]*?)(\bPAT_B\b)([^;]*;)

其中组用于提取匹配的不同部分。

但是,我没有成功排除包含“NOT_MATCH_THIS”的匹配项。

我已经检查了post“How to negate specific word in regex?”关于否定前瞻。但是,那里的答案似乎匹配整行而不是上述模式要求。而且我不确定我应该如何将负面前瞻纳入我的正则表达式模式。

有什么方法可以匹配满足所有四个要求的正则表达式吗?

我手头没有 RegEx 解释器,但你可以试试这个:

(PAT_A[^;]*?(?!NOT_MATCH_THIS))(\bPAT_B\b)([^;]*;)

或者也许:

(PAT_A[^;]*?(?!NOT_MATCH_THIS)[^;]*?)(\bPAT_B\b)([^;]*;)

你可能会用到

^PAT_A[^;\n]*(?:\n(?![^\n;]*NOT_MATCH_THIS)[^;\n]*)*\n[^;\n]*PAT_B[^;]*;

在部分中,模式匹配:

  • ^ 字符串开头
  • PAT_A字面匹配
  • [^;\n]* 可选择匹配任何字符,除了 ; 或换行符
  • (?:非捕获组(整体重复)
    • \n(?![^\n;]*NOT_MATCH_THIS)匹配一个换行符,断言字符串不包含NOT_MATCH_THIS且不包含;或换行符留在同一行
    • [^;\n]* 如果前面的断言为真,则匹配整行(不包含;
  • )*关闭非捕获组,并可选择重复匹配所有行
  • \n[^;\n]* 匹配换行符,以及除 ; 或换行符之外的任何字符
  • PAT_B[^;]*; 然后匹配 PAT_B 后跟除 ; 之外的任何字符,然后匹配 ;

Regex demo