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";
}