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