2

我在 exim 日志中为这行编写正则表达式时遇到了一些麻烦

 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放在一个正则表达式中。我尝试使用逻辑来解决这个问题: 找到'F ='之前的最后一个字符串,用空格分隔并且可以锁定在< >

你能帮我写下这个逻辑吗?

4

4 回答 4

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)) {
    # ...
  }
}
于 2011-05-13T06:59:52.533 回答
1

采用:

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

(?<= xxx )语法是一个lookbehind 断言,而the是(?= xxx )一个lookahead 断言。

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

于 2011-05-13T06:59:36.073 回答
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])?
于 2011-05-13T06:56:13.043 回答
0

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

于 2011-05-13T11:59:35.177 回答