Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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

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_Email Validation - Fatal编程技术网

Regex 用于电子邮件拆分的Perl正则表达式

Regex 用于电子邮件拆分的Perl正则表达式,regex,perl,email-validation,Regex,Perl,Email Validation,我的同事问我,如果有多个@`存在,您将如何查找最后一个 例如: j@ssi@aliencoders.com@..coding.com 所以它应该显示j@ssi@aliencoders.com作为用户名,而.coding.com作为域名。 Perl中是否有任何一个线性正则表达式可以获得所需的输出?Perl中的量词在默认情况下是贪婪的。这意味着他们会尽可能多地抓住 您需要的是一个简单的: ($username, $domain) = ($string =~ /(.*)@(.*)$/); 如果要1

我的同事问我,如果有多个@`存在,您将如何查找最后一个

例如:

j@ssi@aliencoders.com@..coding.com
所以它应该显示
j@ssi@aliencoders.com
作为用户名,而
.coding.com
作为域名。
Perl中是否有任何一个线性正则表达式可以获得所需的输出?

Perl中的量词在默认情况下是贪婪的。这意味着他们会尽可能多地抓住

您需要的是一个简单的:

($username, $domain) = ($string =~ /(.*)@(.*)$/);
如果要100%确定第二部分没有
@
,可以使用:

($username, $domain) = ($string =~ /(.*)@([^@]*)$/);

只需使用greedyness:

/(.*)@(.*)$/
第一部分将尽可能多地使用它,直到它遇到一个@。最后一部分将处理@后面的所有内容,直到行尾

my ($username, $domain) = $str =~ /(.*)@(.*)/;
更多信息请访问:

默认情况下,量化的子模式是“贪婪的”,也就是说,它将 尽可能多地匹配(给定特定的起始位置) 同时仍然允许模式的其余部分匹配


使用Email::Address。这些事情对于简单的re来说太难了。哎呀,我没有仔细阅读op,但这段代码可以用来拆分电子邮件

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

my $line = 'bill@example.com;joe@example.com';
my @addresses = Email::Address->parse($line);
for my $address (@addresses) {
  print $address->format, "\n";
}

为什么要麻烦初始化
$user
$domain
?谢谢。如果您同时使用strict和warnings模块,则需要进行初始化,以便获得任何错误或警告。效率有多高?我写了同样的东西,但我正在寻找更好的解决方案,从文件中过滤出每一个这样的邮件ID。感谢Koneark提供的正则表达式:)关于“它有多高效”的唯一真正答案是“基准测试”,但是编译这样一个简单的正则表达式应该不是问题。Perl实际上是为regexp设计的。如果您认为另一种解决方案(可能是索引+子字符串?可能是拆分?)可能更快,那么也可以对它们进行基准测试:]最后一行有一些额外的内容。对于贪婪搜索,我认为它没有任何用处…所以你的第一个代码和第二个代码有相同的效果。ThanksIt要求在使用电子邮件之前安装电子邮件::Address。默认情况下,它不存在。否则,对于所有电子邮件验证工作来说,它是一个很酷的模块
use strict;
use warnings;
use Email::Address;

my $line = 'bill@example.com;joe@example.com';
my @addresses = Email::Address->parse($line);
for my $address (@addresses) {
  print $address->format, "\n";
}