正则表达式匹配以空格开头的可选部分的字符串



我需要帮助弄清楚如何匹配一个字符串,将有可选的部分。问题是可选部分将以空格和<作为前缀,并以>作为后缀。这是我现在的

^([\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<(.+?(?=>$|$))

这将改变你已抓获的指标组,和将允许您捕获只有你感兴趣的部分,同时仍然能够表示外组织为可选的(通过()?)。

相关内容

  • 没有找到相关文章

最新更新