【问题标题】:In Perl, how can I extract email addresses from lines in log files?在 Perl 中,如何从日志文件的行中提取电子邮件地址?
【发布时间】:2012-04-11 16:23:21
【问题描述】:

我正在寻找一个字符串,该字符串将通过逐行读取文件来创建。但是我只想从字符串中提取电子邮件,但它每次都会改变。唯一的内容是域,例如@domain.com

所以对于输入字符串

 00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: test.test@domain.com  Channel: channel16

什么正则表达式会查找@domain.com 并取出所有test.test@domain.com。我有一个正则表达式,它将查找字符串m/@domain.com/i,但我不知道一旦@domain.com 位于整个字符串中后如何操作字符串。

我想要的输出只是电子邮件test.test@domain.com

【问题讨论】:

  • /(.*?@domain.com)/i 将是最简单的版本,将(希望)整个电子邮件地址捕获为 1 美元。

标签: regex perl


【解决方案1】:
#!/usr/bin/env perl

use strict; use warnings;
use Email::Address;


while (my $line = <DATA>) {
    my ($addr) = Email::Address->parse($line);
    print $addr->address, "\n";
}

__DATA__
00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: test.test@domain.com  Channel: channel16

输出:

C:\temp> tt
test.test@domain.com

【讨论】:

    【解决方案2】:

    在电子邮件地址之前总是会有空格吗?如果是这样,你可以使用类似的东西:

    m/\s([^\s\@]+\@domain.com)/i
    

    然后您可以通过查看$1 来检索整个电子邮件地址。

    【讨论】:

    • 这不起作用,因为它将数组@domain 插入到正则表达式中。它要么失败,要么产生错误的结果。
    【解决方案3】:

    如果您需要正则表达式的所有结果(每行不止一封电子邮件),您可以这样做:

    while ($str =~ s# ([^ ]+\@domain.com)##i){
      my $email = $1;
      print $email."\n";
    }
    

    问候,

    【讨论】:

    • 非常感谢您的回复。这是一个很好的解决方案,但是对于这种情况,每行只会有一封电子邮件。
    【解决方案4】:

    看起来您只需要使用/\S+\@domain\.com/ 捕获域字符串之前的所有非空白字符。这个程序显示了原理。

    my $s = '00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: test.test@domain.com  Channel: channel16';
    print "$_\n" for $s =~ /\S+\@domain\.com/gi;
    

    输出

    test.test@domain.com
    

    【讨论】:

      猜你喜欢
      • 2016-04-12
      • 2017-06-11
      • 2015-12-28
      • 2014-03-23
      • 1970-01-01
      • 2020-01-17
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多