Perl中的正则表达式,用于电子邮件分割

时间:2012-02-29 10:47:57

标签: regex perl email-validation

我的同伴问我,你最后会找到@ if more than one @`。

示例:

j@ssi@aliencoders.com@..coding.com

因此,它应显示j@ssi@aliencoders.com作为用户名,..coding.com作为域名。 在Perl中是否有任何一个衬垫正则表达式来获得所需的输出?

5 个答案:

答案 0 :(得分:8)

my ($username, $domain) = $str =~ /(.*)@(.*)/;

perlre中的更多信息:

  

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

答案 1 :(得分:6)

只需使用贪婪:

/(.*)@(.*)$/

第一部分将尽可能多地使用,直到遇到@。最后一部分将把@后面的所有内容都放到行尾。

答案 2 :(得分:2)

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

你想要的是一个简单的:

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

如果您想100%确定第二部分没有@,您可以使用:

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

使用电子邮件::地址。这些事情对于简单的正确做法来说太难了。哎呀,没有读得足够接近,但这段代码适用于拆分电子邮件。

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