在Perl中,如何从日志文件中的行中提取电子邮件地址?

时间:2012-04-11 16:23:22

标签: regex perl

我希望修剪一个字符串,该字符串将逐行读取文件。但是,我只想从字符串中提取电子邮件,但每次都会更改。唯一的问题是域名,例如@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

4 个答案:

答案 0 :(得分:7)

#!/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

答案 1 :(得分:3)

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

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

然后,您可以查看$1

来检索整个电子邮件地址

答案 2 :(得分:0)

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

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

的问候,

答案 3 :(得分:0)

看起来您只需要使用/\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