我在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; 的
你能帮我写这个逻辑吗?
答案 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是。