正则提取日志时间戳与接收速率时分组匹配范围溢出如何解决
问题分析
问题根源是正则中.*的贪婪匹配特性:默认情况下.*会尽可能多匹配字符,而你后面跟的\s*、[0-9]*都是允许匹配0个字符的规则,正则引擎会优先让.*多吃内容,只要剩余部分能满足后面的匹配规则即可,因此把时间戳之后的空格和数字也吞进了第一个分组。
解决方案
有两种常用的修改方式,都可以适配时间戳后空格数量不固定的场景:
方案1:改用非贪婪匹配(最简单的修改方式)
把第一个分组的贪婪匹配改为非贪婪匹配,同时把后面的\s*改为\s+(时间戳和后面的数字之间至少存在1个空格,用+避免匹配0个导致贪婪逻辑失效):
^(.*?)\s+[0-9]+\s+\([0-9]+\)\s+Receive\s+rate:\s+([0-9]+)
这里的.*?是非贪婪匹配,会尽可能少匹配内容,直到遇到第一个满足\s+[0-9]+(一个或多个空格加数字)的位置就停止,正好把时间戳完整留在第一个分组。
方案2:精准匹配时间戳格式(稳定性更高)
如果你的日志时间戳格式固定(月/日/年 时:分:秒 AM/PM),可以直接限定第一个分组的匹配规则,完全避免贪婪问题,匹配精度更高:
^(\d{1,2}/\d{1,2}/\d{4}\s+\d{1,2}:\d{1,2}:\d{1,2}\s+[AP]M)\s+[0-9]+\s+\([0-9]+\)\s+Receive\s+rate:\s+([0-9]+)
测试效果
两种方案匹配你给出的样例日志,都可以得到预期分组结果:
- 分组1:
9/14/2021 6:01:14 PM、9/14/2021 6:01:29 PM - 分组2:
39338、215363
内容的提问来源于stack exchange,提问作者feedthemachine
相关产品推荐
相关产品推荐

