Perl 正则表达式 获取邮件地址

发布于 2024-11-07 07:23:25 字数 1430 浏览 3 评论 0原文

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

 1. 2011-05-12 11:30:26 1QKRHt-0001aD-Vd => mail <[email protected]> F=<[email protected]> bla bla 
 2. 2011-04-22 12:01:31 1QDCF0-0002ss-Nw => /var/mail/mail <[email protected]> F=<[email protected]> bla bla 
 3. 2011-05-12 11:29:01 1QKRGU-0001a5-Ok => [email protected] F=<[email protected]> bla bla

,我想将其放入变量 [电子邮件受保护] 在一个正则表达式中。我尝试使用这样的逻辑:在'F='之前找到最后一个字符串,用空格分隔,并且可以锁定在< >

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

ive got some trouble with writting regex for this lines in exim log

 1. 2011-05-12 11:30:26 1QKRHt-0001aD-Vd => mail <[email protected]> F=<[email protected]> bla bla 
 2. 2011-04-22 12:01:31 1QDCF0-0002ss-Nw => /var/mail/mail <[email protected]> F=<[email protected]> bla bla 
 3. 2011-05-12 11:29:01 1QKRGU-0001a5-Ok => [email protected] F=<[email protected]> bla bla

and i want to put to variable this [email protected] in one regexp. ive tryed to use logic lile this: find last string before 'F=', seperated by whitespaces and can be locked in < >

Can you help me to write this logic?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

站稳脚跟 2024-11-14 07:23:25

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

# 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)) {
    # ...
  }
}

You can use the following regex:

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

And then it is a good idea to validate your match with Mail-RFC822-Address perl module, so the full code could be:

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

# the line should be in variable $line
if ($line =~ /.*?\s+<?(\S+?)>?\s+F=/) {
  if (valid($1)) {
    # ...
  }
}
且行且努力 2024-11-14 07:23:25

使用:

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

(?<= xxx ) 语法是后向断言,而 (?= xxx ) 是先行断言。

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

Use:

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

The (?<= xxx ) syntax is a lookbehind assertion, and the (?= xxx ) is a lookahead assertion.

this will not check the validity of the e-mail address, just extract that part of the line.

帅哥哥的热头脑 2024-11-14 07:23:25

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

Regex is not the measure, Email::Valid is.

美人如玉 2024-11-14 07:23:25

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

\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])?

Here is a Email Validation Regex

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

It will extract an email from anywhere.

I hope this RFC2822 one posts correctly.

[a-z0-9!#$%&'*+/=?^_\`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)\*@(?:\[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+\[a-z0-9](?:[a-z0-9-]\*[a-z0-9])?
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文