如何编写满足4项匹配规则的多行正则,排除含NOT_MATCH_THIS的结果
最终实现正则
需保留原有分组结构的话可以使用如下表达式,无需额外开启匹配模式即可支持跨行匹配:
(PAT_A(?:(?!NOT_MATCH_THIS)[^;])*?)(\bPAT_B\b)((?:(?!NOT_MATCH_THIS)[^;])*;)
匹配逻辑说明
- 以
PAT_A作为匹配起点,满足开头规则 - 用
(?:(?!NOT_MATCH_THIS)[^;])*替换原有[^;]*片段:该语法会在匹配每一个非分号字符前,先校验当前位置后方不存在NOT_MATCH_THIS字符串,从根源上禁止区间内出现目标禁用词,覆盖PAT_A到末尾分号的全部范围 - 中间保留
\bPAT_B\b的强制匹配逻辑,满足区间必须包含PAT_B的要求,同时保留原分组用于提取 - 全程仅匹配非分号字符,最终匹配到的
;必然是PAT_A之后出现的第一个分号,满足结尾规则
验证结果
- 合法用例可正常匹配,三个分组分别对应「PAT_A开头到PAT_B前的内容」、「PAT_B本身」、「PAT_B到结尾分号的内容」,符合原有提取需求
- 包含
NOT_MATCH_THIS的非法用例会被直接拦截,不会返回匹配结果
内容的提问来源于stack exchange,提问作者user31054
相关产品推荐
相关产品推荐

