匹配中没有特定单词的多行正则表达式匹配模式
Regex matching pattern in multiple lines without specific word in the match
我想在多行中匹配以下模式
- 模式开始于“PAT_A”
- 模式以第一个“;”结尾在“PAT_A”
之后
- 模式在“PAT_A”和“;”之间包含“PAT_B”
- 模式在“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 后跟除 ;
之外的任何字符,然后匹配 ;
我想在多行中匹配以下模式
- 模式开始于“PAT_A”
- 模式以第一个“;”结尾在“PAT_A” 之后
- 模式在“PAT_A”和“;”之间包含“PAT_B”
- 模式在“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 后跟除;
之外的任何字符,然后匹配;