【发布时间】:2012-02-29 10:47:57
【问题描述】:
我的同行问我,你将如何寻找最后一个 @if more than one@` 存在。
例子:
j@ssi@aliencoders.com@..coding.com
所以它应该显示j@ssi@aliencoders.com 作为用户名和..coding.com 作为域名。
Perl 中是否有任何一种线性正则表达式来获得所需的输出?
【问题讨论】:
标签: regex perl email-validation
我的同行问我,你将如何寻找最后一个 @if more than one@` 存在。
例子:
j@ssi@aliencoders.com@..coding.com
所以它应该显示j@ssi@aliencoders.com 作为用户名和..coding.com 作为域名。
Perl 中是否有任何一种线性正则表达式来获得所需的输出?
【问题讨论】:
标签: regex perl email-validation
my ($username, $domain) = $str =~ /(.*)@(.*)/;
更多信息在perlre:
默认情况下,量化的子模式是“贪婪的”,也就是说,它会 尽可能多地匹配(给定一个特定的起始位置) 同时仍然允许模式的其余部分匹配。
【讨论】:
只是利用贪心:
/(.*)@(.*)$/
第一部分将尽可能多地使用,直到遇到@。最后一部分将把 @ 后面的所有内容带到行尾。
【讨论】:
默认情况下,Perl 中的量词是贪婪的。这意味着他们会尽可能多地抓住。
你想要的很简单:
($username, $domain) = ($string =~ /(.*)@(.*)$/);
如果你想 100% 确定第二部分没有@,你可以使用:
($username, $domain) = ($string =~ /(.*)@([^@]*)$/);
【讨论】:
$str='j@ssi@aliencoders.com@..coding.com';
$user=qw();
$domain=qw();
while($str=~m/\@/g){
$user=$`;
$domain=$';
}
print "user -> $user\n";
print "domain->$domain\n";
【讨论】:
$user和$domain?
使用电子邮件::地址。这些事情对于简单的 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";
}
【讨论】: