2

我正在寻找将通过逐行读取文件创建的字符串。但是我只想从字符串中提取电子邮件,但它每次都会改变。唯一的内容是域,例如@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

4 回答 4

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:\温度> tt
test.test@domain.com
于 2012-04-11T16:40:06.897 回答
3

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

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

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

于 2012-04-11T16:25:45.490 回答
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
于 2012-04-11T16:43:00.977 回答
0

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

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

问候,

于 2012-04-11T16:36:01.440 回答