Perl5兼容正则实现指定词开头匹配及单独匹配取后续段方法
PCRE兼容正则实现@@分隔文本的开头匹配逻辑
规则梳理
匹配逻辑需同时覆盖两类场景:
- 普通场景:从指定起始词位置正向查找,截取从起始词开始到下一个
@@分隔符之间的全部内容 - 特殊场景:如果两个
@@之间的内容仅为指定起始词本身(前后允许存在空白字符),则跳过该段,直接读取该段之后紧邻的下一个@@分隔段内的全部内容
本次指定起始词为bank representative,测试文本为@@分隔的多段文本块,预期返回2项匹配结果:
- 首个以该起始词开头的
@@分隔段内的完整文本 - 仅包含该起始词的分隔段之后的文本块:
Other functions may include ordering checks
原有方案缺陷
初步编写的正则@@\s*+bank representative\b.*?(?=@@)仅能覆盖普通场景的开头匹配,未对「整段仅为起始词」的特殊场景做分支判断,无法自动跳段取后续内容。
可用正则实现
符合Perl 5兼容规范的正则如下:
@@\s*\K(?:bank representative\b(?!\s*(?:@@|$)).*?|bank representative\s*(?=@@|$)\s*@@\s*\K.*?)(?=@@|$)
逻辑拆解
@@\s*\K:匹配段起始的@@分隔符及后续空白,通过\K重置匹配起始位置,避免分隔符本身被纳入匹配结果- 第一匹配分支(普通场景):
bank representative\b(?!\s*(?:@@|$)).*?
匹配到起始词后,通过负向预查判断当前段并非仅包含起始词(即起始词后不是直接跟空白+分隔符/文本结尾),直接匹配当前段到下一个@@前的所有内容 - 第二匹配分支(特殊场景):
bank representative\s*(?=@@|$)\s*@@\s*\K.*?
匹配到起始词后,通过正向预查确认当前段仅包含起始词(即起始词后只有空白,直接衔接分隔符/文本结尾),随后跳过当前段结尾的@@和下一段开头的空白,再次通过\K重置匹配起点,匹配下一段到下一个@@前的全部内容 - 结尾边界
(?=@@|$):确保匹配在遇到下一个分隔符或文本末尾时停止,不会出现跨段越界的问题
匹配效果
该正则在测试文本中可准确返回2个预期结果,无多余匹配、无漏匹配。
内容的提问来源于stack exchange,提问作者shekhar_singhal
相关产品推荐
相关产品推荐

