求助:修复正则表达式匹配至空格加数字(\s\d)的失效问题
正则表达式提取日志字段问题解决
问题描述
我正在构建正则表达式提取日志中的特定字段,其中Type字段可能包含多个空格,需要匹配到空格+数字(\s\d)的位置为止。但当前正则表达式对第三个示例日志无效,现提供当前正则及示例日志:
当前正则:
Added:\s+(?<Type>[^\d]+)\s(?P<Transaction_ID>\d+)\s[^\(]+\((?P<Status>\w+)
示例日志:
[2023-08-31T12:02:40,758] [async-1 ] INFO Added: ABC XYX CCC 265333655 IR_TEST (VERIFIED)[2023-08-31T12:02:41,192] [async-1 ] INFO Added: XX_Rates 265332643 IR_TEST (VERIFIED)[2023-08-31T12:02:43,452] [async-1 ] INFO Added: XX_Rates_4_XX 26533555 IR_TEST (VERIFIED)
问题分析
当前正则中(?<Type>[^\d]+)的逻辑是匹配非数字的所有字符,但第三个日志的Type字段(XX_Rates_4_XX)包含数字4,导致正则在遇到4时就停止匹配Type,后续的Transaction_ID提取也随之出错,这就是第三个示例失效的核心原因。
解决方案
将Type字段的匹配逻辑改为匹配到第一个空格+数字序列之前的所有内容,用正向预查实现边界判断,修正后的正则如下:
Added:\s+(?<Type>.+?)(?=\s\d+)\s(?P<Transaction_ID>\d+)\s[^\(]+\((?P<Status>\w+)
关键修改说明:
- 把
(?<Type>[^\d]+)替换为(?<Type>.+?)(?=\s\d+):.+?:非贪婪匹配任意字符(包括数字),避免过度匹配(?=\s\d+):正向预查,确保匹配内容的末尾紧跟空格+数字,以此作为Type字段的结束标记
测试验证
对三个示例日志提取结果如下,均能正确匹配目标字段:
- 第一个日志:
- Type:
ABC XYX CCC - Transaction_ID:
265333655 - Status:
VERIFIED
- Type:
- 第二个日志:
- Type:
XX_Rates - Transaction_ID:
265332643 - Status:
VERIFIED
- Type:
- 第三个日志:
- Type:
XX_Rates_4_XX - Transaction_ID:
26533555 - Status:
VERIFIED
- Type:
内容的提问来源于stack exchange,提问作者Ankit Goyal
相关产品推荐
相关产品推荐

