如何编写正则实现SCHEDULE文本块内的指定目标行筛选与校验
正则匹配需求及实现方案
需求说明
从以SCHEDULE开头、END结尾的文本块中,按以下规则匹配内容:
- 提取SCHEDULE行
#后最后一段作为基础关键词,若关键词包含下划线,取下划线前的内容作为匹配前缀 - 匹配块内同时满足以下条件的行:包含
#符号、以上述匹配前缀加字母E开头、可保留原关键词下划线后的后缀内容
需求示例
SCHEDULE行示例
SCHEDULE MANAGER_XA#KGDIVAGBLR 或 SCHEDULE MANAGER_XA#KGICROBLR_2 或 SCHEDULE MASTERAGENTS#KGICRO741_AABB 或 SCHEDULE MANAGER_XA#/XAAA/KAAA/KGICROZZZ 或 SCHEDULE MANAGER_XA#/XAAA/KAAA/KGFLABUR_4 或 SCHEDULE MASTERAGENTS#/KA0H/KA0HM00_FACT/KA0HM00_FACT END
匹配效果示例
1. 无下划线前缀匹配
SCHEDULE行内容为SCHEDULE MANAGER_XA#/XAAA/KAAA/KGICROZZZ,提取匹配前缀为KGICROZZZ,目标匹配项为KGICROZZZE,完整文本块如下:
SCHEDULE MANAGER_XA#/XAAA/KAAA/KGICROZZZ DESCRIPTION "Added by default." : S89COLENG2#/KG34/KG34G43CR3/KG34G1086 NOP FOLLOWS KG34G1085 S89COLENG2#/KG34/KG34G43CR3/KGICROZZZE FOLLOWS KG34G493 FOLLOWS KG34G522 S89COLENG2#/KG34/KG34G43CR3/KG34G1086 NOP FOLLOWS KG34G1085 END
2. 带下划线前缀匹配
若SCHEDULE行最后一段为KGFLABUR_4,提取匹配前缀为KGFLABUR,匹配KGFLABURE或KGFLABURE_4均符合要求:
SCHEDULE MANAGER_XA#/XAAA/KAAA/KGFLABUR_4 S89COLENG2#/KG34/KG34G43CR3/KGFLABURE 或 S89COLENG2#/KG34/KG34G43CR3/KGFLABURE_4
若SCHEDULE行末尾为KAAABBB_CCC,提取匹配前缀为KAAABBB,匹配KAAABBBE_CCC符合要求:
SCHEDULE MANAGER_XA#/XAAA/KAAA/KAAABBB_CCC DESCRIPTION "Added by default." : S89COLENG2#/KG34/KG34G43CR3/KG34G1086 NOP FOLLOWS KG34G1085 S89COLENG2#/KG34/KG34G43CR3/KAAABBBE_CCC FOLLOWS KG34G493 FOLLOWS KG34G522 S89COLENG2#/KG34/KG34G43CR3/KG34G1086 NOP FOLLOWS KG34G1085 END
正则实现方案
以下正则基于PCRE2引擎编写,支持反向引用和单行模式。
1. 匹配包含符合规则行的SCHEDULE块
(?s)SCHEDULE\s+.*#.*?(?<prefix>[^/_\n]+)(?:_\S+)?\s*\n(?:(?!END).)*?\n.*#.*?\k<prefix>E(?:_\S+)?\s*(?:\n(?!END).)*?\nEND
逻辑说明:
- 开启单行模式后先匹配SCHEDULE行,捕获
#后最后一段下划线前的内容为prefix分组 - 匹配块内任意非END内容,直到遇到符合规则的目标行
- 最终匹配到块结束标识END
2. 匹配不包含符合规则行的SCHEDULE块
(?s)SCHEDULE\s+.*#.*?(?<prefix>[^/_\n]+)(?:_\S+)?\s*\n(?:(?!END|.*#.*?\k<prefix>E(?:_\S+)?).)*\nEND
逻辑说明:
- 匹配SCHEDULE行捕获前缀后,限定块内内容既不包含END,也不包含符合规则的目标行
- 最终匹配到块结束标识END
内容的提问来源于stack exchange,提问作者italo_pm
相关产品推荐
相关产品推荐

