重复的正则表达式/ PCRE命名了捕获组,并且前面有一个匹配项

时间:2019-07-16 13:47:10

标签: regex pcre regex-group

我正在尝试解析sendmail日志。这些是分开的-在不同的行上有“到”和“从”。我想匹配“收件人”,以便确定我们正在查找的行是“收件人”行,然后捕获尽可能多的电子邮件地址。与此类似,有很多寻求帮助的请求,但没有一个(完全符合我的要求,我已经找到了,我保证我一直在寻找!)。

我尝试过使用Stack Overflow的几种解决方案,但均未成功。问题是“ to =”不是可选的,而是必需的。 PCRE正则表达式可能吗?

到目前为止,

正则表达式(仅与第一个电子邮件地址匹配):

to\=((\<)?(?P<to>.+?\@.+?)(\>)?\,)

示例行:

Jul 16 13:35:05 mailserver sendmail[30892]: xxxxxxxxxxxxxx: to=user1@example.derp,user2@example.derp,user3@example.derp, delay=00:00:00, xdelay=00:00:00, mailer=smtp, pri=91785, relay=relay.example.derp [1.2.3.4], dsn=2.0.0, stat=Sent (<xxxxxxxxxxxxx.xxxxxxxxxxxx@mailserver.derp> Queued mail for delivery)

理想情况下,'to \ ='之后的匹配项将匹配出现的电子邮件地址,而不仅仅是第一个。如果对此有答案,那么我会错过/无法屈从于我的情况,对不起。

2 个答案:

答案 0 :(得分:2)

您可以利用\G锚来获得迭代匹配,以在上一个匹配的末尾声明位置,并在捕获组中捕获电子邮件地址。

(?:to=|\G(?!^))([^,\s@]+@[^@,\s]+),

说明

  • (?:非捕获组
    • to=字面上匹配
    • |
    • \G(?!^)在上一场比赛的末尾而不是在开始时断言
  • )关闭非捕获组
  • (捕获组1
    • [^,\s@]+@[^@,\s]+否定的字符类,将逗号(@或空格)以外的任何字符与之间的@相匹配
  • ),关闭第1组并匹配逗号

Regex demo

答案 1 :(得分:0)

这是我最终使用的:

,\s*delay=.+|(?<=to=|,),?(<)?(?<to>[^@,=]+@[^<>\,]+) 

这不是完美的,但对我有用。