Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Perl中,如何从日志文件中的行提取电子邮件地址?_Regex_Perl - Fatal编程技术网

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

Regex 在Perl中,如何从日志文件中的行提取电子邮件地址?,regex,perl,Regex,Perl,我想修剪一个字符串,它将通过逐行读取文件创建。然而,我只想从字符串中取出电子邮件,但每次都会更改。唯一的内容是域,例如@domain.com 所以对于 00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: test.test@domain.com Channel: channel16 哪个正则表达式将查找@domain.com,并拉出所有测试。test@domain.com。我有一个正则表达式,它将查找字符串m/

我想修剪一个字符串,它将通过逐行读取文件创建。然而,我只想从字符串中取出电子邮件,但每次都会更改。唯一的内容是域,例如
@domain.com

所以对于

 00:00:50,004 ERROR [SynchronousCallback] Cannot process resource: test.test@domain.com  Channel: channel16
哪个正则表达式将查找
@domain.com
,并拉出所有
测试。test@domain.com
。我有一个正则表达式,它将查找字符串
m/@domain.com/i
,但我不知道在整个字符串中找到
@domain.com
后如何操作字符串


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

电子邮件地址前是否总是有空格?如果是这样,您可以使用以下内容:

m/\s([^\s\@]+\@domain.com)/i
然后,您可以通过查看
$1

来检索整个电子邮件地址。如果您需要regexp的所有结果(每行多封电子邮件),您可以执行以下操作:

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

#/usr/bin/env perl
#!/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
严格使用;使用警告; 使用电子邮件::地址; while(我的$line=){ 我的($addr)=电子邮件::地址->解析($line); 打印$addr->address,“\n”; } __资料__ 00:00:50004错误[SynchronousCallback]无法处理资源:测试。test@domain.com频道:16频道
输出:

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

my$s='00:00:50004错误[SynchronousCallback]无法处理资源:测试。test@domain.com信道:信道16’;
为$s=~/\s+\@domain\.com/gi打印“$\un”;
输出

测试。test@domain.com

/(.*domain.com)/i
将是最简单的版本,将(希望)整个电子邮件地址捕获为1美元。非常感谢您的回复。这是一个很好的解决方案,但是在这种情况下,每行只有一封电子邮件。这将无法正常工作,因为它会将数组
@domain
插入正则表达式中。它要么失败,要么产生错误的结果。