Наивные решения для регулярных выражений
Следующие решения решат вашу проблему, как опубликовано, но не предназначены для решения всех возможных крайних случаев. Комплексный анализ адресов электронной почты нетривиален и требует анализатора, такого как Email::Address если вы хотите справиться со всей сложностью RFC.
Печать вашего TLD из строки
Поскольку вы уже знаете строку, которую хотите напечатать в случае успеха (например, ".com"), вам на самом деле не нужен результат совпадения с регулярным выражением; вы можете распечатать строку, хранящуюся в $Tld, если совпадение истинно, используя условие после утверждения. Например:
$Mail = '[email protected]';
$Tld = '.com';
print "$Tld\n" if $Mail =~ /${Tld}$/;
Это будет правильно печатать:
.com
Печать матча
Если вы действительно хотите полное совпадение, есть несколько способов сделать это. Один из способов — использовать специальную переменную $&:
$Mail = '[email protected]';
$Tld = '.com';
if ($Mail =~ /${Tld}$/) {
print "$&\n";
}
Это также будет правильно печатать:
.com
Разделение строки
Все предыдущие примеры решат вашу проблему, как было опубликовано, но лучшее общее решение, если не считать синтаксического анализатора, состоит в том, чтобы действительно разделить TLD и рассматривать последний сегмент домена как непроверенный TLD. В Ruby есть очень удобный раздел String#rpartition. метод, но я не знаю о подобной функции в Perl. Тем не менее, вы можете использовать привязанное соответствие, чтобы добиться того же самого. Например:
$Mail = '[email protected]';
$Mail =~ /(\.[[:alpha:]]+)$/;
print "$1\n";
Если вам нужно проверить TLD на соответствие ожидаемому значению, например .com
, вы можете сравнить его со строкой или переменной. Например:
$Mail = '[email protected]';
$Tld = '.com';
$Mail =~ /(\.[[:alpha:]]+)$/;
print "$1\n" if $1 eq $Tld
person
Todd A. Jacobs
schedule
15.08.2015
@.*\.(.*)
Это сохранит все после последнего.
в$1
или\1
. Однако для иностранных доменов это не сработает, или, скорее, вам также понадобится домен второго уровня, как я подозреваю (например, co.uk). - person chris85   schedule 16.08.2015