Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > регулярное выражение для проверки e-mail


Автор: Agares 15.7.2008, 18:25
Помогите составить регулярное выражение для мыла.
делал так: 
Код

^(\w)+\@(\w)+\.(\w)+


результат вот такой получается:
Код

Введенный Вами адрес ([email protected]) не корректный!
Введенный Вами адрес ([email protected]) корректный!
Введенный Вами адрес ([email protected]@) корректный!


Какое нужно исспользовать рег. выражение?

Автор: tolkien 15.7.2008, 18:36
^([\w\-.]+)\@(\w+)\.(\w+)

Автор: Agares 15.7.2008, 18:37
Прише к такому решению: /^[A-Za-z\.]+\@(\w)+\.[A-Za-z\.]+$/

но если ввести мыло [email protected] то говорит что корректный. Как сделать, что бы только одну точку перед собакой ставить можно?

Автор: KSURi 15.7.2008, 18:42
Не идеально, но мне подходит)
Код

/^[\w\d\.-]+@[\w\d\.-]+\.[a-zA-Z]{2,4}$/


Добавлено через 3 минуты и 5 секунд
Agares, а почему одну точку? А если домен второго уровня?

Автор: Agares 15.7.2008, 18:48
О! То что надо спасибо большое!

Автор: gcc 15.7.2008, 18:50
Код

if (!$email =~ /^[a-zA-Z_\\.-][a-zA-Z0-9_\\.-\\d]*\\@[a-zA-Z\\.-\\d]+\\.[a-zA-Z]{2,4}$/) ) {

Автор: arto 15.7.2008, 19:00
это просто праздник какой-то!
ни одного правильного ответа! smile

Автор: KSURi 15.7.2008, 19:00
gcc, странная какая-то регулярка у вас, я бы не стал такую использовать)
Более того, у вас все слеши зачем-то эскейпятся, это влияет на работоспособность всего регулярного выражения. Также символ @ не надо 
эскейпить, т.к. у него нет никакой мета-ф-ии. 

Автор: Agares 15.7.2008, 19:02
Блин, все ок, но только Введенный Вами адрес ([email protected]) корректный!

нужно это исправить. поможете?

Автор: KSURi 15.7.2008, 19:08
Код

use Email::Address;

smile

Автор: Agares 15.7.2008, 19:10
Дело в том, что задача - написать регулярное выражение

Автор: tolkien 15.7.2008, 19:40
просто узнайте спецификацию постройки e-mail и сделайте так как там сказано.

Автор: Itsys 15.7.2008, 19:57
Вот самая точная:
Код

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

Автор: gcc 15.7.2008, 20:11
еще можно попробовать подключиться к данному email, если он есть - значит адресс правильный!  smile 

Автор: Agares 15.7.2008, 21:00
Цитата(Itsys @  15.7.2008,  19:57 Найти цитируемый пост)
Вот самая точная:

 smile Честно говоря, я сначала испугался...

Вот эта подходит больше всего:
Код

   /^[\w\d\.-]+@[\w\d\.-]+\.[a-zA-Z]{2,4}$/


но нужно ее подкарректировать, что бы [email protected] воспринималось как не правильное мыло. Мне подсказали, что нужно использовать группировку. но как я не понял. Эксперементы прошли не удачно

Автор: arto 15.7.2008, 21:52
бедные музейщики, им не послать почту.
[email protected] тоже неправильный адрес?
jfyi: [email protected] -- вполне себе валидный синтаксис.

Автор: AlexPet 16.7.2008, 07:41
Цитата(KSURi @ 15.7.2008,  19:00)
Также символ @ не надо эскейпить, т.к. у него нет никакой мета-ф-ии.

Вообще-то массивы интерполируются в регулярном выражении smile

Код

my @a = (1, 2);
$_ = '31 23';
/(@a)/;
print "'$1'";


Цитата

'1 2'

Автор: Agares 16.7.2008, 07:57
Хм.. не знал. спасибо.

А кто может помочь решить проблему? 

Автор: tolkien 16.7.2008, 09:31
Большая и толстая книга вам в помощь. Раздел про рег выражения. За основу возмите одно из рег выражениях написанных выше и улучшайте его.

Автор: Agares 16.7.2008, 09:41
Я понимаю, но может у кого есть готовое решение? Просто мне максимально быстро нужно это сделать..

Автор: Agares 16.7.2008, 10:40
Сделал вот так:
Код

/^([\w\d\-]+\.{0,1})+@[\w\d\-]+(\.{1}[\w\d\-]+)+$/

Автор: IceSunrise 16.7.2008, 11:14
AlexPet

Цитата

Вообще-то массивы интерполируются в регулярном выражении 


Если после @ идет корректное имя переменной, то да, в противном случае можно не экранировать.

Код

my $str = '[email protected]';
my $res = ($str =~ /@1gmail\.com/) ? "YES!\n" : "NO!\n";
print $res;

Автор: AlexPet 16.7.2008, 11:18
IceSunrise, да, именно так.
Но ИМХО лучше не испытывать судьбу и написать лишний обратный слеш (мало ли, через пару недель об этом забудешь smile )

Да и warning лишний не нужен (по крайней мере в ActivePerl)

Автор: arto 16.7.2008, 11:21
в \w входит '_', в доменной части запрещено (фокусы с * опустим).

Добавлено через 14 минут и 42 секунды
btw, для первоначальной проверки можно использовать:

# perl -le 'my $re = shift; print "RE: /$re/"; print $a,"\t",($a =~ m#$re# ? "YES":"NO") eq $b ? "PASSED":"FAIL" while (($a,$b) = splice@ARGV,0,2);' \
 '^([\w\d\-]+\.{0,1})+@[\w\d\-]+(\.{1}[\w\d\-]+)+$' \
[email protected] YES a+test@com YES [email protected] YES a@b_c.com NO [email protected] YES aa%[email protected] YES "aa.bb.cc.dd@[192.168.1.1]" YES [email protected] NO %[email protected] NO [email protected] NO
RE: /^([\w\d\-]+\.{0,1})+@[\w\d\-]+(\.{1}[\w\d\-]+)+$/
[email protected] PASSED
a+test@com      FAIL
[email protected]        PASSED
a@b_c.com       FAIL
[email protected]        PASSED
aa%[email protected]        FAIL
aa.bb.cc.dd@[192.168.1.1]       FAIL
[email protected]      PASSED
%[email protected]      PASSED
[email protected]  PASSED

все должно быть PASSED.
дополнения приветствуются :)

Автор: gcc 1.10.2008, 00:01
Data::Validate::Email

http://search.cpan.org/search?m=all&q=Data%3A%3AValidate%3A&s=1

этоти модули наверное подойдут для этого дела? там где важное чтобы не прошел мусор? 

чтобы не было rm -rf /  smile 

Автор: VutDen 22.1.2014, 14:54
Вот держи, сам пользуюсь, поределение 99% 

Цитата

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?


а то что то простенькие у тебя выражения:)

Автор: arto 22.1.2014, 15:52
ошибка сходу -- пропустит домены вида a-------b.c---------d

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)