perl正则表达式用于电子邮件地址

时间:2011-05-13 06:52:06

标签: regex perl parsing logging exim

我在exim log

中为这些行编写正则表达式时遇到了一些麻烦
 1. 2011-05-12 11:30:26 1QKRHt-0001aD-Vd => mail <mail@mail.example.com> F=<root@example.com> bla bla 
 2. 2011-04-22 12:01:31 1QDCF0-0002ss-Nw => /var/mail/mail <root@mail.mealstrom.org.ua> F=<root@example.com> bla bla 
 3. 2011-05-12 11:29:01 1QKRGU-0001a5-Ok => mail@mail.example.com F=<root@example.com> bla bla

我希望在一个正则表达式中改变此 mail@mail.example.com 。我试图使用逻辑lile:在'F ='之前找到最后一个字符串,由空格分隔并且可以锁定在&lt; &GT;

你能帮我写这个逻辑吗?

4 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式:

# the line should be in variable $line
if ($line =~ /.*?\s+<?(\S+?)>?\s+F=/) {
  # ...
}

然后最好使用Mail-RFC822-Address perl模块验证您的匹配,因此完整代码可以是:

use Mail::RFC822::Address qw(valid);

# the line should be in variable $line
if ($line =~ /.*?\s+<?(\S+?)>?\s+F=/) {
  if (valid($1)) {
    # ...
  }
}

答案 1 :(得分:1)

使用:

/(?<=<)\S*(?=>\s*F=)/

(?<= xxx )语法是一个后瞻性断言,(?= xxx )是一个先行断言。

这不会检查电子邮件地址的有效性,只需提取该部分行。

答案 2 :(得分:0)

这是电子邮件验证正则表达式

\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b

它将从任何地方提取电子邮件。

我希望这个RFC2822正确发布。

[a-z0-9!#$%&'*+/=?^_\`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)\*@(?:\[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+\[a-z0-9](?:[a-z0-9-]\*[a-z0-9])?

答案 3 :(得分:0)

正则表达式不是衡量标准,Email::Valid是。