正则表达式从损坏机器日志行捕获两个分组的实现方案咨询
损坏日志行拆分正则实现方案
直接用带正向预查的非贪婪匹配正则即可,不需要额外编写复杂的边界判断逻辑,可同时解决你提到的两个问题:
可用正则规则
\d{4}\.\d{2}\.\d{2} \d{2}:\d{2}:\d{2}.*?(?=\s*\d{4}\.\d{2}\.\d{2} \d{2}:\d{2}:\d{2}|$)
规则说明
- 针对「需要完整捕获带时间戳的日志内容」的需求:直接把时间戳匹配规则放在匹配段最开头,最终输出的匹配结果天然包含完整时间戳,不需要额外调整捕获逻辑。注意原规则里时间戳部分的
.是通配符,建议转义为\.,避免误匹配非点号的异常字符,提升准确率。 - 针对「终止边界设置」的需求:通过两个组合规则实现:
- 中间的日志内容部分使用
.*?非贪婪匹配模式,不会无限制匹配到行尾 - 匹配段末尾使用正向预查
(?=...)定义终止触发条件,两个条件用|做或逻辑判断:- 条件1:匹配到下一条日志开头的时间戳(前侧允许带任意空白字符,适配拼接处的空格场景)
- 条件2:匹配到当前行的行尾
$
正向预查不会将终止位置的字符纳入当前匹配结果,刚好满足拆分后日志内容无冗余的要求。
- 中间的日志内容部分使用
使用注意事项
- 匹配前仅需剔除行首的
\x00特殊标识和连带的前导空白即可,不需要额外做其他预处理 - 该规则同时兼容正常单行单日志、损坏行拼接2条及以上日志的场景,不需要为正常行和损坏行单独写两套匹配逻辑
样例匹配结果
针对给出的损坏行样例,该正则可直接输出两个符合预期的匹配结果:
- 匹配项1:
2019.09.12 10:04:46,611,ALARM ,O,501, Check machine - 匹配项2:
2019.09.12 10:06:22,611,ALARM ,E,303,ARM 2 VACUUM ERROR !!
如果业务场景下时间戳分隔符确实存在非点号的情况(比如斜杠、横杠),可以把转义后的\.改回通配符.即可,绝大多数生产场景下转义后的匹配误判率更低。
内容的提问来源于stack exchange,提问作者bramb
相关产品推荐
相关产品推荐

