Регулярное выражение в Perl для разделения электронной почты - PullRequest
3 голосов
/ 29 февраля 2012

Мой коллега спросил меня, как будет выглядеть последний @ if more than one @ `.

Пример:

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

Таким образом, он должен отображать j@ssi@aliencoders.com какимя пользователя и ..coding.com в качестве имени домена.Есть ли в Perl одно регулярное выражение для получения желаемого результата?

Ответы [ 5 ]

8 голосов
/ 29 февраля 2012
my ($username, $domain) = $str =~ /(.*)@(.*)/;

Больше информации в perlre :

По умолчанию квантифицированный подшаблон является «жадным», то есть совпадать столько раз, сколько возможно (учитывая конкретное начальное местоположение) все еще позволяя остальной части шаблона соответствовать.

6 голосов
/ 29 февраля 2012

Просто используйте жадность:

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

Первая часть займет столько, сколько может, пока не встретит @.Последняя часть займет все за @ до конца строки.

2 голосов
/ 29 февраля 2012
$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";
2 голосов
/ 29 февраля 2012

квантификаторы в Perl по умолчанию жадные. это означает, что они схватят как можно больше.

то, что вы хотите, это просто:

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

Если вы хотите быть на 100% уверены, что вторая часть не имеет @, вы можете использовать:

($username, $domain) = ($string =~ /(.*)@([^@]*)$/);
1 голос
/ 29 февраля 2012

Использовать E-mail :: Адрес.Эти вещи слишком сложны для того, чтобы простые люди делали правильно.Ой, я не читал оп достаточно близко, но этот код работает для разделения писем.

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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...