如何排查匹配PUBLIC_API请求响应日志的正则表达式问题
正则问题排查
现有正则的问题
- 地址捕获组字符范围错误:
[A-z]实际会匹配ASCII码65到122之间的所有字符,除了大小写字母还包含[、\、]、^、_、`等无关符号;额外写的\0是不必要的空字符匹配规则;且未包含URL中常见的.字符,会导致域名带点的地址匹配失败。 - 未匹配请求体、响应体的外层大括号标记:请求体、响应体实际都包裹在
{}中,你的正则没有匹配开头的{,会导致捕获内容开头多一个{,且匹配位置错位,后续PUBLIC_API_RESPONSE规则无法对齐。 - 硬编码了不必要的空白符:你写正则时的换行、多余空格会被当成匹配规则的一部分,比如请求体捕获组后你换了行再写
PUBLIC_API_RESPONSE,但实际日志中请求体闭合的}后直接跟空格加PUBLIC_API_RESPONSE,规则和实际格式不匹配。 - 地址捕获逻辑冗余:不需要手动枚举URL允许的所有字符,直接匹配到地址后的第一个空格即可,更简单且兼容性更强。
修复方案
修复后的正则(兼容所有支持命名捕获的正则引擎,包括Java、.NET、Python、JavaScript ES2018+等)
PUBLIC_API_REQUEST:(?<address>[^ ]+) \{(?<requestBody>[^}]*)} PUBLIC_API_RESPONSE:\{(?<response>[^}]*)}
匹配逻辑说明
(?<address>[^ ]+):匹配PUBLIC_API_REQUEST:之后的所有非空格字符,直到遇到地址后的第一个空格,完整捕获接口地址\{(?<requestBody>[^}]*)}:匹配地址后空格之后的{到下一个}之间的所有内容,自动支持跨换行的请求体,捕获结果不包含外层的大括号PUBLIC_API_RESPONSE:\{(?<response>[^}]*)}:匹配响应标记后的{到下一个}之间的所有内容,捕获结果不包含外层的大括号
如果你的请求体/响应体内部可能包含转义的}(比如\{),可以把对应的[^}]*替换成(?:\\}|[^}])*即可兼容转义场景。
内容的提问来源于stack exchange,提问作者Ali farahzadi
相关产品推荐
相关产品推荐

