【问题标题】:How can I create a conditional regex for a named capturing group?如何为命名捕获组创建条件正则表达式?
【发布时间】:2017-06-19 19:22:34
【问题描述】:

我们希望将 PMDF 日志转储到 Splunk,我正在尝试解析 PMDF SMTP 日志,特别是消息,我遇到了一个问题,即命名捕获组 (dst_channel) 可能有也可能没有值.到目前为止,这是我的正则表达式:

\d{2}\-\w{3}\-\d{4}\s\d{2}\:\d{2}\:\d{2}\.\d{2}\s(?P<src_channel>\w+)\s+(?P<dst_channel>\w+)\s(?P<code>\w+)\s(?P<bytes>\d+)\s(?P<from>\w.+)\srfc822

我能够匹配以下消息,其中 tcp_msx_out_2 是 dst_channel

02-Feb-2017 08:00:19.60 tcp_exempt   tcp_msx_out_2 E 2 mailman-bounces@list.xyz.com rfc822;user@xyz.com user@xyz.com <mailman.157.1486040414.29131.xxx@xxx.xyz.com> pmdf list.xyz.com ([x.x.x.x])

但是,我不匹配以下不包含 dst_channel 值的日志:

02-Feb-2017 09:00:01.59 tcp_imap_int              Q 12 xxx@xyz.com rfc822;user@imap-internal.xyz.com user@imap.xyz.com <6940401380880269855036@PT-D69> pmdf  user@imap.xyz.com: smtp;452 4.2.2 Over quota

我拥有的下一个命名捕获组是第一个消息示例中的代码 E,第二个消息示例中的代码 Q),当 dst_channel 不存在时,正则表达式不会捕获所有代码。

如何修改条件语句的正则表达式,以便如果 dst_channel 存在,它会获取值,但如果没有,正则表达式会继续并能够始终如一地获取我拥有的其他命名捕获组的值?

【问题讨论】:

    标签: regex conditional conditional-statements named-captures


    【解决方案1】:

    如果我将\w+ 更改为\w*,它会起作用

    \d{2}\-\w{3}\-\d{4}\s\d{2}\:\d{2}\:\d{2}\.\d{2}\s(?P<src_channel>\w+)\s+(?P<dst_channel>\w*)\s(?P<code>\w+)\s(?P<bytes>\d+)\s(?P<from>\w.+)\srfc822
    

    你可以测试一下here

    【讨论】:

      【解决方案2】:

      我建议你使用

      \d{2}-\w{3}-\d{4}\s+\d{2}:\d{2}:\d{2}\.\d{2}\s+(?P<src_channel>\w+)(?:\s+(?P<dst_channel>\w+))?\s+(?P<code>\w+)\s+(?P<bytes>\d+)\s+(?P<from>\S+)\s+rfc822
                                                                         ^^^                       ^^  
      

      请参阅regex demo

      基本上,将所有\s 替换为\s+,并通过将\s+ 和整个dst 通道组包装为可选的非捕获组来使dst 通道组成为可选。

      此外,from 组模式应替换为 \S+(一个或多个除空格以外的字符),因为您想匹配电子邮件,而 .+ 可能(而且通常确实如此)过度匹配。

      【讨论】:

      • 这就是答案,这个正则表达式比我的效率高,不到一半的步骤
      • Wiktor,感谢一百万的回复和详细的正则表达式,非常感谢。是否可以安全地说任何时候我想表示一个非捕获组我需要包装 \s+ 和捕获的命名组:(?:\s+(?P\w+))?
      • 一个可选捕获组,(?:...)?。它并不总是有效(这取决于该组周围的模式),但通常效果很好,尤其是在我们摆脱了所有.*-like 模式之后。
      • 最后一个问题 - 我是否也使用非捕获组处理消息的尾端?消息一的结尾是:smtp;452 4.2.2 Over quota 消息二的结尾是:([1.1.1.1]) 我希望能够捕获源 IP,如果它被列出了 Thx
      • 再次感谢您的澄清
      猜你喜欢
      • 2019-03-17
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 2011-10-04
      • 2019-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多