【问题标题】:perl regexp for mail address用于电子邮件地址的 perl 正则表达式
【发布时间】:2011-08-24 16:51:47
【问题描述】:

在 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

我想把这个 ma​​il@mail.example.com 放在一个正则表达式中。我尝试使用以下逻辑:找到 'F=' 之前的最后一个字符串,用空格分隔,可以锁定在

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

【问题讨论】:

标签: regex perl parsing logging exim


【解决方案1】:

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

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

【讨论】:

  • 我用这个包来验证电子邮件。你的正则表达式有效。你已经为这个项目做出了贡献:D github.com/mealstrom/plp2sql 电子邮件是有效的,因为它们已经在日志中。
【解决方案2】:

用途:

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

(?&lt;= xxx ) 语法是后向断言,(?= xxx ) 是前瞻断言。

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

【讨论】:

    【解决方案3】:

    正则表达式不是度量,Email::Valid 是。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 我认为这在 @ 之后的部分中缺少一些方括号来定义字符类
      • 它似乎不会发布,由于某种原因不断被削减。我添加了另一个。
      • 它是非标准的。例如foo+bar@gmail.com 是一个有效的电子邮件地址,而您不支持它。见this !
      • 我已经设法发布了 RFC2822 之一。花了一点时间,但它显示在网站上。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-12
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2011-10-14
      相关资源
      最近更新 更多