我需要帮助弄清楚如何匹配一个字符串,将有可选的部分。问题是可选部分将以空格和<
作为前缀,并以>
作为后缀。这是我现在的
^([\w,:\s.]+)\s-\s<([A-Z]+)>\s<([\s\w-]+)>\s<([\w-]+)>(\s<[\d.]+>)?(\s<[\d]+>)?\s<([\w.]+)>\s-\s<(.+?(?=>$|$))
这是我要匹配的字符串
Jul 09, 2022 03:05:12.570 AM - <DEBUG> <Default Executor-thread-26> <logging-poc> <100.99.88.1> <123456> <myco> - <Inside getDebugLog()>
(\s<[\d.]+>)?
和(\s<[\d]+>)?
对应ip地址和帐号。目前,匹配结束时包括空格和< >
。
Record map{logdatetime=Jul 09, 2022 03:05:12.570 AM, severity=DEBUG, thread=Default Executor-thread-26, application=logging-poc, ip= <100.99.88.1>, account= <123456>, module=myco, message=Inside getDebugLog()>}
我只想要ip和帐户的值,就像下面
Record map{logdatetime=Jul 09, 2022 03:05:12.570 AM, severity=DEBUG, thread=Default Executor-thread-26, application=logging-poc, ip=100.99.88.1, account=123456, module=myco, message=Inside getDebugLog()>}
该模式也应该适用于这行日志(其中可选部分已被删除)
Jul 09, 2022 03:05:12.570 AM - <DEBUG> <Default Executor-thread-26> <logging-poc> <myco> - <Inside getDebugLog()>
谢谢。
在第5和第6个捕获组中出现问题。
- 第五组:
(s<[d.]+>)?
- 第六组:
(s<[d]+>)?
这些将捕获周围的空间和<
/>
。解决方案是在子组中捕获所需的信息:
- 第五(现在是第六)组:
(s<([d.]+)>)?
- 现在是第7(和第8)组:
(s<([d]+)>)?
原来的组7现在是组9,原来的组8现在是组10。
根据您下面的评论,由于您需要保持相同的组索引,您可以使用非捕获组,使用语法(?:pattern)
。
- 5组(括号内):
(?:s<([d.]+)>)?
- 第6组(括号内):
(?:s<([d]+)>)?
最终结果正则表达式(使用Java转义):
^([\w,:\s.]+)\s-\s<([A-Z]+)>\s<([\s\w-]+)>\s<([\w-]+)>\s(?:<([\d.]+)>)?(?:\s<([\d]+)>)?\s<([\w.]+)>\s-\s<(.+?(?=>$|$))
这将不改变你已抓获的指标组,和将允许您捕获只有你感兴趣的部分,同时仍然能够表示外组织为可选的(通过()?
)。