正则匹配含空格前缀可选段日志 捕获值带多余< >及空格问题求助
问题原因
当前正则的可选字段捕获组把前置空格、前后包裹的<、>都包含在了捕获括号范围内,所以提取出的IP、账号字段会携带这些多余字符。
修正后正则
^([\w,:\s.]+)\s-\s<([A-Z]+)>\s<([\s\w-]+)>\s<([\w-]+)>(?:\s<([\d.]+)>)?(?:\s<(\d+)>)?\s<([\w.]+)>\s-\s<(.+?(?=>$|$))
核心调整点:
- 把两个可选字段的外层包裹结构(前置空格、
<、>)移到(?:...)非捕获组中,非捕获组只负责判断整段可选字段是否存在,不会返回捕获内容 - 在非捕获组内部单独设置捕获括号,仅提取IP、账号的纯内容,不会带入多余符号
- 保留原正则的其他匹配逻辑,兼容可选字段缺失的场景
匹配效果验证
带IP、账号的完整日志
对应样例:
Jul 09, 2022 03:05:12.570 AM - <DEBUG> <Default Executor-thread-26> <logging-poc> <100.99.88.1> <123456> <myco> - <Inside getDebugLog()>
捕获分组对应结果:
- 分组1(logdatetime):
Jul 09, 2022 03:05:12.570 AM - 分组2(severity):
DEBUG - 分组3(thread):
Default Executor-thread-26 - 分组4(application):
logging-poc - 分组5(ip):
100.99.88.1 - 分组6(account):
123456 - 分组7(module):
myco - 分组8(message):
Inside getDebugLog()
缺失IP、账号的日志
对应样例:
Jul 09, 2022 03:05:12.570 AM - <DEBUG> <Default Executor-thread-26> <logging-poc> <myco> - <Inside getDebugLog()>
捕获分组对应结果:
- 分组1(logdatetime):
Jul 09, 2022 03:05:12.570 AM - 分组2(severity):
DEBUG - 分组3(thread):
Default Executor-thread-26 - 分组4(application):
logging-poc - 分组5(ip):无匹配(空值)
- 分组6(account):无匹配(空值)
- 分组7(module):
myco - 分组8(message):
Inside getDebugLog()
补充说明
当前正则默认可选字段顺序为「IP段在前、账号段在后」,如果实际业务日志存在仅缺失IP、保留账号的乱序场景,需要额外调整可选组的匹配逻辑,当前写法已覆盖给出的两类样例场景。
内容的提问来源于stack exchange,提问作者shyamala
相关产品推荐
相关产品推荐

