我正在尝试解析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 \ ='之后的匹配项将匹配出现的电子邮件地址,而不仅仅是第一个。如果对此有答案,那么我会错过/无法屈从于我的情况,对不起。
答案 0 :(得分:2)
您可以利用\G
锚来获得迭代匹配,以在上一个匹配的末尾声明位置,并在捕获组中捕获电子邮件地址。
(?:to=|\G(?!^))([^,\s@]+@[^@,\s]+),
说明
(?:
非捕获组
to=
字面上匹配|
或\G(?!^)
在上一场比赛的末尾而不是在开始时断言)
关闭非捕获组(
捕获组1
[^,\s@]+@[^@,\s]+
否定的字符类,将逗号(@或空格)以外的任何字符与之间的@
相匹配),
关闭第1组并匹配逗号答案 1 :(得分:0)
这是我最终使用的:
,\s*delay=.+|(?<=to=|,),?(<)?(?<to>[^@,=]+@[^<>\,]+)
这不是完美的,但对我有用。