正则表达式如何移除含EXCLUDE标识行并匹配保留目标连续行
正则实现按规则排除含指定标识的文本行
核心规则
- 排除标识:整行包含字符串
EXCLUDE的行需要从结果中移除 - 移除排除行时,仅可连带删除该行的前导换行符或尾随换行符,不可二者同时删除
- 可选达标逻辑:仅匹配首个连续有效文本块,匹配范围截止到首次出现含
EXCLUDE的行;如果全程未遇到标识行,则匹配到文档末尾
测试样例
原始待处理文本
EXCLUDE this entire line include this line and this as single match and EXCLUDE this line
预期输出结果
include this line and this as single match
正则实现方案
根据使用的正则引擎支持特性,可选择对应写法:
支持\K语法的引擎(PCRE、Python regex模块、PHP等)
开启多行模式(m修饰符),使用如下正则即可直接拿到匹配结果:
^(?:.*EXCLUDE.*\R)*\K(?:(?!^.*EXCLUDE).*\R?)*
语法说明:
^(?:.*EXCLUDE.*\R)*:匹配文本开头所有连续的排除行,连带每行末尾的换行符一起匹配,符合“仅删除排除行尾随换行、不同时删除前后换行”的要求\K:重置匹配起始点,将前面匹配到的排除行内容从最终结果中丢弃(?:(?!^.*EXCLUDE).*\R?)*:逐行匹配不含EXCLUDE的内容,遇到第一行带EXCLUDE的文本立刻停止匹配,行尾可选匹配换行符,不会误删后续排除行的前导换行
不支持\K语法的引擎(JavaScript原生正则、Java等)
开启多行模式(m修饰符),使用带捕获组的正则,提取第一个捕获组的内容即可:
/^(?:.*EXCLUDE.*[\r\n]*)*([\s\S]*?)(?=^.*EXCLUDE|$)/m
该写法逻辑和上述版本一致,通过正向预查判断停止位置,捕获组内的内容就是需要的首个连续有效文本块,经样例验证可精准返回预期的两行结果。
内容的提问来源于stack exchange,提问作者Chebz
相关产品推荐
相关产品推荐

