多行场景下正则匹配两字符串间内容 排除含特定标识片段
问题根因
原有正则存在两处逻辑缺陷,直接导致跨块匹配错误:
- 负向预查
(?!client : 1)仅校验了POST /api/user/register字符串后紧邻的内容,完全没有约束起止标识之间的整段内容不能出现client : 1 - 无边界的非贪婪通配
[\s\S]*?遇到中间含client : 1的无效块时不会终止匹配,会持续向后查找最近的client : 2,最终把相邻无效日志块也纳入匹配结果。
可用正则
开启全局匹配修饰符g,使用以下正则即可精准提取所有符合要求的独立日志块:
POST /api/user/register(?:(?!client : 1)[\s\S])*?client : 2
匹配逻辑:命中起始标识后,每匹配一个字符前都会先校验当前位置后不存在
client : 1,一旦遇到client : 1就自动放弃当前无效块,从下一个起始标识重新开始校验,直到命中中间无client : 1、以client : 2结尾的完整有效块才返回结果。
额外避坑
- 不要在正则开头追加
.*,这类无边界通配会把有效块前的无关内容带入结果,污染输出。 - 如果日志存在同接口请求连续出现的场景(上一个请求未输出
client : 2就收到下一个同接口请求),使用以下增强版正则彻底杜绝跨块问题:POST /api/user/register(?:(?!client : 1|POST /api/user/register)[\s\S])*?client : 2 - 该正则兼容所有主流正则引擎(JS、Python、Java、Go等),无需额外开启多行模式即可正常运行。
内容的提问来源于stack exchange,提问作者hxy
相关产品推荐
相关产品推荐

