Java regex, который примет как example@example.com, так и example@example.co.uk [дубликат]

Это потому, что простой «=» не предназначен для компаса. Вместо этого используйте «==».

2943
задан 16 revs, 13 users 68% 19 February 2018 в 21:33
поделиться

30 ответов

Регулярное полностью совместимое с RFC 822 неэффективно и неясно из-за его длины. К счастью, RFC 822 был заменен дважды, а текущая спецификация адресов электронной почты - RFC 5322 . RFC 5322 приводит к регулярному выражению, которое можно понять, если его изучить в течение нескольких минут и достаточно эффективно для фактического использования.

Одно регулярное выражение, совместимое с RFC 5322, можно найти в верхней части страницы в http : //emailregex.com/ , но использует шаблон IP-адреса, который плавает по интернету, с ошибкой, которая позволяет 00 для любого из десятичных значений без знака в разделителе с точкой, что является незаконным. Остальная часть, по-видимому, согласуется с грамматикой RFC 5322 и проходит несколько тестов с использованием grep -Po, включая имена доменов, IP-адреса, плохие и имена учетных записей с кавычками и без них.

Исправление 00 в шаблоне IP, мы получаем рабочее и довольно быстрое регулярное выражение. (Очистить визуализированную версию, а не уценку, для фактического кода.)

(?: [A-z0-9! # $% & Amp; '* + / =? ^ _ `{ |} ~ -] +:; | - * | "((\ [а-z0-9 # $% & амп '* + / = ^ _` {} ~] +?.!?): [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21 \ x23- \ X5b \ x5d- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) * ") @ (? : (?: [а-z0-9] (: [а-z0-9 -] * [а-z0-9]) \?.) + [а-z0-9] (?: [а-z0 -9 -] * [а-z0-9]) |? \ [(:( :( 2 (5 [0-5?] | 1 [0-9 | [0-4] [0-9]) ] [0-9] | [1-9] [0-9])) \) {3} (:( 2 (5 [0-5] |?.? [0-4] [0-9]) | 1 [0-9] [0-9] | [1-9] [0-9]) | [а-z0-9 -] * [а-z0-9]:? (: [\ x01- \ x08 \ x0b \ x0c \ x0e- \ x1f \ x21- \ X5a \ x53- \ x7f] | \\ [\ x01- \ x09 \ x0b \ x0c \ x0e- \ x7f]) +) \])

Здесь диаграмма машины конечного состояния для вышеперечисленного регулярного выражения, которая более ясна, чем сама регулярная регрессия

Более сложные шаблоны в Perl и PCRE (библиотека регулярных выражений, например, на PHP) могут правильно разобрать RFC 5322 без заминки . Python и C # тоже могут это сделать, но они используют другой синтаксис из этих первых двух. Однако, если вы вынуждены использовать один из многих менее мощных языков сопоставления с образцами, тогда лучше всего использовать настоящий парсер.

Также важно понимать, что проверка его в RFC абсолютно ничего не говорит о том, действительно ли этот адрес существует в поставляемом домене, или является ли лицо, входящее в адрес, его истинным владельцем. Люди подписывают других до списков рассылки таким образом все время. Фиксирование, требующее более любезной проверки, которая включает отправку этого адреса, сообщение, которое включает токен подтверждения, предназначенный для ввода на той же веб-странице, что и адрес.

Подтверждающие жетоны - единственный способ узнать, что вы получили адрес человека, входящего в него. Вот почему большинство списков рассылки теперь используют этот механизм для подтверждения регистрации. В конце концов, любой может подавить president@whitehouse.gov, и это будет даже разоблачать как законное, но вряд ли это будет на другом конце.

Для PHP вы должны не используйте шаблон, указанный в . Подтвердите адрес электронной почты с помощью PHP, правильный путь , из которого я цитирую:

Существует некоторая опасность того, что общее использование и широкое небрежное кодирование установит фактический стандарт для адресов электронной почты, который является более ограничительным, чем записанный формальный стандарт.

Это не лучше, чем все другие шаблоны, отличные от RFC. Он даже не достаточно умен, чтобы обрабатывать даже RFC 822 , не говоря уже о RFC 5322. Однако это .

Если вы хотите получить фантазию и педантичность, реализовать полный механизм состояния . Регулярное выражение может действовать только как элементарный фильтр. Проблема с регулярными выражениями заключается в том, что кто-то говорит, что их совершенно корректный адрес электронной почты недействителен (ложный положительный результат), потому что ваше регулярное выражение не может справиться с этим, это просто грубо и невежливо с точки зрения пользователя. Механизм состояния для этой цели может как проверять, так и даже исправлять адреса электронной почты, которые в противном случае считались бы недействительными, поскольку он разбирает адрес электронной почты в соответствии с каждым RFC. Это позволяет потенциально более приятный опыт, например

Указанный адрес электронной почты 'myemail @ address, com' недействителен. Вы имели в виду «myemail@address.com»?

См. Также Проверка адресов электронной почты , включая комментарии. Или Сравнение адреса электронной почты Проверка регулярных выражений .

Debuggex Demo

2071
ответ дан 23 revs, 17 users 18% 15 August 2018 в 14:36
поделиться
  • 1
    Вы сказали, что «нет хорошего регулярного выражения». Является ли это общим или конкретным для проверки адреса электронной почты? – Tomalak 14 October 2008 в 15:33
  • 2
    @Tomalak: только для адресов электронной почты. Как сказал Борцмайер, RFC чрезвычайно сложный – Luk 14 October 2008 в 17:23
  • 3
    Статья в линейном журнале, которую вы упоминаете, фактически неверна в нескольких отношениях. В частности, Lovell явно не читал ошибки в RFC3696 и повторяет некоторые ошибки в опубликованной версии RFC. Подробнее здесь: dominicsayers.com/isemail – Dominic Sayers 8 April 2009 в 16:56
  • 4
    Jeff Atwood имеет замечательное регулярное выражение в этом сообщении блога, чтобы проверить все действующие адреса электронной почты: codinghorror.com/blog/2005/02/regex-use-vs-regex-abuse.html – CMircea 22 March 2010 в 19:26
  • 5
    Кажется, что эти сценарии не работают с именами доменов unicode – Zsolti 23 July 2010 в 21:00

Существует не тот, который действительно полезен. Я обсуждаю некоторые проблемы в моем ответе . Есть ли библиотека php для проверки адресов электронной почты? , она также обсуждается в Regexp-распознавании адреса электронной почты?

Короче говоря, не ожидайте, что одно полезное регулярное выражение будет работать правильно. И лучшее регулярное выражение будет проверять синтаксис, а не действительность электронной почты (jhohn@example.com верен, но он, вероятно, будет отказываться ...).

137
ответ дан 2 revs 15 August 2018 в 14:36
поделиться
  • 1
    Насколько мне известно, некоторые библиотеки тоже ошибаются. Я смутно помню, что у PHP PEAR была такая ошибка. – bortzmeyer 14 October 2008 в 15:34
  • 2
    Ах, ну да. Если вы скажете, что никто не идеален, некоторые реализации по-прежнему будут ближе к совершенству, чем другие :) – Chris Vest 14 October 2008 в 15:36
  • 3
    Эта страница также имеет оговорку внизу о нескольких вещах из спецификации. что регулярное выражение не поддерживает. – Chris Vest 14 October 2008 в 15:37
  • 4
    Это спецификация RFC 822, а не спецификация RFC 5322 . – tchrist 7 November 2010 в 21:12
  • 5
    Исправьте меня, если я ошибаюсь, но я считаю, что PHP использует шаблоны PCRE. Если это так, вы должны создать нечто похожее на шаблон Abigail RFC 5322 . – tchrist 7 November 2010 в 21:24
  • 6
    @tchrist: не уверен, что PCRE догнал этот синтаксис (который я обнаружил). Если это так, не уверен, что PCRE от PHP догнал эту версию PCRE ... Ну, если я правильно понимаю этот синтаксис, вы также можете использовать парсер PEG, гораздо более ясный и полный, чем регулярное выражение. – PhiLho 10 November 2010 в 15:51
  • 7
    PCRE имеет догнал его, но, возможно, PHP не догнал PCRE. ☹ – tchrist 10 November 2010 в 16:09
  • 8
    В конечном счете, он прав в том, что единственный способ действительно проверить адрес электронной почты - отправить ему электронное письмо и ждать ответа. – Blazemonger 26 October 2011 в 20:43
  • 9
    получает голосование, именно то, что я собирался сказать. Не обрабатывает IDN, но конвертирование в ненадежный код заранее разрешает это. PHP & gt; = 5.3 имеет idn_to_ascii () для этого. Один из лучших и простых способов проверки электронной почты. – Taylor 26 January 2012 в 01:00
public bool ValidateEmail(string sEmail)
{
    if (sEmail == null)
    {
        return false;
    }

    int nFirstAT = sEmail.IndexOf('@');
    int nLastAT = sEmail.LastIndexOf('@');

    if ((nFirstAT > 0) && (nLastAT == nFirstAT) && (nFirstAT < (sEmail.Length - 1)))
    {
        return (Regex.IsMatch(sEmail, @"^[a-z|0-9|A-Z]*([_][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*([.][a-z|0-9|A-Z]+)*(([_][a-z|0-9|A-Z]+)*)?@[a-z][a-z|0-9|A-Z]*\.([a-z][a-z|0-9|A-Z]*(\.[a-z][a-z|0-9|A-Z]*)?)$"));
    }
    else
    {
        return false;
    }
}
8
ответ дан 2 revs, 2 users 67% 15 August 2018 в 14:36
поделиться

Это легко в Perl 5.10 или новее:

/(?(DEFINE)
   (?<address>         (?&mailbox) | (?&group))
   (?<mailbox>         (?&name_addr) | (?&addr_spec))
   (?<name_addr>       (?&display_name)? (?&angle_addr))
   (?<angle_addr>      (?&CFWS)? < (?&addr_spec) > (?&CFWS)?)
   (?<group>           (?&display_name) : (?:(?&mailbox_list) | (?&CFWS))? ;
                                          (?&CFWS)?)
   (?<display_name>    (?&phrase))
   (?<mailbox_list>    (?&mailbox) (?: , (?&mailbox))*)

   (?<addr_spec>       (?&local_part) \@ (?&domain))
   (?<local_part>      (?&dot_atom) | (?&quoted_string))
   (?<domain>          (?&dot_atom) | (?&domain_literal))
   (?<domain_literal>  (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
                                 \] (?&CFWS)?)
   (?<dcontent>        (?&dtext) | (?&quoted_pair))
   (?<dtext>           (?&NO_WS_CTL) | [\x21-\x5a\x5e-\x7e])

   (?<atext>           (?&ALPHA) | (?&DIGIT) | [!#\$%&'*+-/=?^_`{|}~])
   (?<atom>            (?&CFWS)? (?&atext)+ (?&CFWS)?)
   (?<dot_atom>        (?&CFWS)? (?&dot_atom_text) (?&CFWS)?)
   (?<dot_atom_text>   (?&atext)+ (?: \. (?&atext)+)*)

   (?<text>            [\x01-\x09\x0b\x0c\x0e-\x7f])
   (?<quoted_pair>     \\ (?&text))

   (?<qtext>           (?&NO_WS_CTL) | [\x21\x23-\x5b\x5d-\x7e])
   (?<qcontent>        (?&qtext) | (?&quoted_pair))
   (?<quoted_string>   (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
                        (?&FWS)? (?&DQUOTE) (?&CFWS)?)

   (?<word>            (?&atom) | (?&quoted_string))
   (?<phrase>          (?&word)+)

   # Folding white space
   (?<FWS>             (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
   (?<ctext>           (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
   (?<ccontent>        (?&ctext) | (?&quoted_pair) | (?&comment))
   (?<comment>         \( (?: (?&FWS)? (?&ccontent))* (?&FWS)? \) )
   (?<CFWS>            (?: (?&FWS)? (?&comment))*
                       (?: (?:(?&FWS)? (?&comment)) | (?&FWS)))

   # No whitespace control
   (?<NO_WS_CTL>       [\x01-\x08\x0b\x0c\x0e-\x1f\x7f])

   (?<ALPHA>           [A-Za-z])
   (?<DIGIT>           [0-9])
   (?<CRLF>            \x0d \x0a)
   (?<DQUOTE>          ")
   (?<WSP>             [\x20\x09])
 )

 (?&address)/x
195
ответ дан 2 revs, 2 users 97% 15 August 2018 в 14:36
поделиться
  • 1
    Хотелось бы увидеть это на Python – tdc 15 December 2011 в 18:36
  • 2
    Я думаю, что только подмножество части addrspec действительно имеет отношение к вопросу. Принимая более того и пересылая его, хотя какая-то другая часть системы, которая не готова принимать полные адреса RFC5822, похоже на то, что стрельба - это ваша собственная нога. – dolmen 17 December 2011 в 15:53
  • 3
    Отлично (+1), но технически это не регулярное выражение, конечно ... (что было бы невозможно, так как грамматика не была регулярной). – Rinke 3 January 2013 в 23:41
  • 4
    регулярные выражения перестали быть регулярными некоторое время назад. Это действительное Perl 'regex', хотя! – rjh 10 March 2014 в 17:00
  • 5
    Я установил тест для этого регулярного выражения на IDEone: ideone.com/2XFecH Однако это не справедливо и отлично. & Quot; Будет ли кто-нибудь взволнован? Я что-то упускаю? – Mike 30 July 2014 в 18:56

Спецификация HTML5 предлагает простое регулярное выражение для проверки адресов электронной почты:

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

Это намеренно не соответствует RFC 5322 .

Примечание. Это требование является преднамеренным нарушением из RFC 5322 , которое определяет синтаксис для адресов электронной почты, которые одновременно слишком строги ( перед символом @), слишком расплывчатым (после символа @) и слишком слабым (позволяя использовать комментарии, пробельные символы и кавычки в манерах, незнакомых большинству пользователей).

Общая длина также может быть ограничена 254 символами, за RFC 3696 errata 1690 .

15
ответ дан 3 revs 15 August 2018 в 14:36
поделиться
  • 1
    Лучший ответ! Вот ссылка на рекомендацию w3: w3.org/TR/html5/forms.html#valid-e-mail-address Это регулярное выражение используется многими браузерами. – Ryan Taylor 6 November 2017 в 23:13
  • 2
    Это НЕ лучший ответ! Этот шаблон соответствует этому полностью недействительному адресу: invalid@emailaddress. Я бы настоятельно рекомендовал и много тестирования, прежде чем использовать его! – Sheridan 21 March 2018 в 12:47
  • 3
    @Sheridan, если вы считаете, что есть проблема с спецификацией HTML5, вы можете поставить проблему здесь: github.com/w3c/html/issues – Ross Allan 21 March 2018 в 13:56
  • 4
    Это не добавляет многого над stackoverflow.com/a/8829363 и будет ИМХО быть лучше, как отредактировать или прокомментировать это. – hvd 29 April 2018 в 21:50
  • 5
    пример @ localhost действителен, но для приложения реального мира вы можете использовать расширение домена, все, что вам нужно сделать, это изменить окончательный * на + для достижения этого (изменение этой части шаблона от 0+ до 1+ ) – Mitch Satchwell 16 May 2018 в 09:05

Это регулярное выражение из библиотеки Perl Email :: Valid . Я считаю, что это самый точный, он соответствует всем 822. И он основан на регулярном выражении в книге О'Рейли:

Регулярное выражение, построенное с использованием примера Джеффри Фридла в Освоение регулярных выражений ( http://www.ora.com/catalog/regexp/ ).

$RFC822PAT = <<'EOF';
[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\
xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xf
f\n\015()]*)*\)[\040\t]*)*(?:(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\x
ff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n\015
"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\
xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80
-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*
)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\
\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\
x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|"[^\\\x80-\xff\n
\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*)*@[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([
^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\
\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\
x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-
\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()
]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\
x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\04
0\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\
n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\
015()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?!
[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\
]]|\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\
x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\01
5()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*|(?:[^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]
)|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^
()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037]*(?:(?:\([^\\\x80-\xff\n\0
15()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][
^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)|"[^\\\x80-\xff\
n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015"]*)*")[^()<>@,;:".\\\[\]\
x80-\xff\000-\010\012-\037]*)*<[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?
:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-
\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:@[\040\t]*
(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015
()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()
]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\0
40)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\
[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\
xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*
)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80
-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x
80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t
]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\
\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])
*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x
80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80
-\xff\n\015()]*)*\)[\040\t]*)*)*(?:,[\040\t]*(?:\([^\\\x80-\xff\n\015(
)]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\
\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*@[\040\t
]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\0
15()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015
()]*)*\)[\040\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(
\040)<>@,;:".\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|
\\[^\x80-\xff])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80
-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()
]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x
80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^
\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040
\t]*)*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".
\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff
])*\])[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\
\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x
80-\xff\n\015()]*)*\)[\040\t]*)*)*)*:[\040\t]*(?:\([^\\\x80-\xff\n\015
()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\
\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)?(?:[^
(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-
\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\xff\
n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|
\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))
[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff
\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\x
ff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(
?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\
000-\037\x80-\xff])|"[^\\\x80-\xff\n\015"]*(?:\\[^\x80-\xff][^\\\x80-\
xff\n\015"]*)*")[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\x
ff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)
*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*)*@[\040\t]*(?:\([^\\\x80-\x
ff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-
\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)
*(?:[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\
]\000-\037\x80-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\]
)[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-
\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\x
ff\n\015()]*)*\)[\040\t]*)*(?:\.[\040\t]*(?:\([^\\\x80-\xff\n\015()]*(
?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]*(?:\\[^\x80-\xff][^\\\x80
-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)*\)[\040\t]*)*(?:[^(\040)<
>@,;:".\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\[\]\000-\037\x8
0-\xff])|\[(?:[^\\\x80-\xff\n\015\[\]]|\\[^\x80-\xff])*\])[\040\t]*(?:
\([^\\\x80-\xff\n\015()]*(?:(?:\\[^\x80-\xff]|\([^\\\x80-\xff\n\015()]
*(?:\\[^\x80-\xff][^\\\x80-\xff\n\015()]*)*\))[^\\\x80-\xff\n\015()]*)
*\)[\040\t]*)*)*>)
EOF
61
ответ дан 3 revs, 2 users 100% 15 August 2018 в 14:36
поделиться
  • 1
    O_O вам также нужно быть мастером регулярных выражений, чтобы понять, что он делает – Chris McGrath 31 January 2013 в 00:20

Согласно официальному стандарту RFC 2822 действительное регулярное выражение электронной почты

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

, если вы хотите использовать его в Java, это действительно очень просто

import java.util.regex.*;

class regexSample 
{
   public static void main(String args[]) 
   {
      //Input the string for validation
      String email = "xyz@hotmail.com";

      //Set the email pattern string
      Pattern p = Pattern.compile(" (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"
              +"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")"
                     + "@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\]");

      //Match the given string with the pattern
      Matcher m = p.matcher(email);

      //check whether match is found 
      boolean matchFound = m.matches();

      if (matchFound)
        System.out.println("Valid Email Id.");
      else
        System.out.println("Invalid Email Id.");
   }
}
11
ответ дан 3 revs, 2 users 97% 15 August 2018 в 14:36
поделиться

Я использую

^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

, который используется в ASP.NET с помощью параметра RegularExpressionValidator.

137
ответ дан 3 revs, 3 users 73% 15 August 2018 в 14:36
поделиться
  • 1
    Бу! Мой (неподтвержденный) адрес !@mydomain.net отклоняется. – Phrogz 19 January 2011 в 22:35
  • 2
    Таким образом, в принципе, это не позволяет смешные адреса электронной почты. :) – Wayne Whitty 16 June 2014 в 16:00
  • 3
    Согласно этой странице data.iana.org/TLD/tlds-alpha-by-domain.txt нет доменов с только одним символом верхнего уровня, например. «something.c», «something.a», здесь представлена ​​версия, которая поддерживает по меньшей мере 2 символа: «something.pl», «something.us»: ^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w{2,}([-.]\\w+)*$ – Tomasz Szulc 19 November 2015 в 13:53
  • 4
    @Wayne Whitty. Вы столкнулись с первичным вопросом о том, следует ли обслуживать подавляющее большинство адресов или ВСЕ, включая те, которые никто не будет использовать, за исключением проверки подлинности электронной почты. – Patanjali 28 November 2015 в 04:13
  • 5
    @TomaszSzulc extra back slash в вашем ответе сбивает с толку, я только что исправил его, и поддержка доменных имен 2-х символов работает, ^ \ w + ([- +. '] \ W +) * @ \ w + ([-.] \ W +) * \ \ ш {2}. ([-.] \ W +) * $ – Aqib Mumtaz 30 November 2015 в 12:16

Этот вопрос задан очень часто, но я думаю, вам следует отступить и спросить себя , почему вы хотите синтаксически проверять адреса электронной почты? Какова польза?

  • Он не будет ловить общие опечатки.
  • Это не мешает людям вводить неверные или созданные адреса электронной почты или вводить чужой адрес ,

Если вы хотите проверить правильность адреса электронной почты, у вас нет выбора, кроме как отправить электронное письмо с подтверждением и ответить на него. Во многих случаях вы имеете , чтобы отправить письмо с подтверждением в любом случае по соображениям безопасности или по этическим соображениям (поэтому вы не можете, например, подписывать кого-то, кто не обслуживает их по своему усмотрению).

500
ответ дан 3 revs, 3 users 77% 15 August 2018 в 14:36
поделиться
  • 1
    Возможно, стоит проверить, что они что-то ввели что-то в поле в подтверждение на стороне клиента, чтобы просто ошибиться, но в целом вы правы. – Martin Beckett 25 August 2009 в 17:25
  • 2
    Мартин, я дал вам +1, только потом прочитал, что foobar @ dk является действительным письмом. Это было бы не очень красиво, но если вы хотите быть совместимым с RFC и использовать здравый смысл, вы должны обнаружить такие случаи, как это, и попросить пользователя подтвердить, что это правильно. – philfreo 16 December 2009 в 01:31
  • 3
    @olavk: если кто-то вводит опечатку (например: me@hotmail), они явно не получат ваше подтверждение по электронной почте, а затем где они? Они больше не на вашем сайте, и им интересно, почему они не смогли зарегистрироваться. На самом деле, нет, они совсем не забыли о вас. Однако, если бы вы могли просто выполнить базовую проверку здравомыслия с помощью регулярного выражения, пока они все еще с вами, тогда они могут сразу поймать эту ошибку, и у вас есть счастливый пользователь. – nickf 2 June 2010 в 14:53
  • 4
    @JacquesB: Вы делаете отличную оценку. Просто потому, что он передает данные в RFC, это не значит, что это действительно адрес пользователя. В противном случае все те president@whitehouse.gov адреса указывают на очень netbusy главнокомандующего. :) – tchrist 7 November 2010 в 21:09
  • 5
    Он не должен быть черным или белым. Если электронное письмо выглядит неправильно, сообщите об этом пользователю. Если пользователь все еще хочет продолжить, пусть он. Не заставляйте пользователя соответствовать вашему регулярному выражению, скорее, используйте регулярное выражение в качестве инструмента, чтобы помочь пользователю узнать, что может быть ошибка. – ninjaneer 18 February 2014 в 04:56
97
ответ дан 38 revs 15 August 2018 в 14:36
поделиться

Все зависит от того, насколько вы точны. Для моих целей, когда я просто стараюсь избегать таких вещей, как bob @ aol.com (пробелы в письмах) или steve (вообще нет домена) или mary@aolcom (без периода до .com), я использую

/^\S+@\S+\.\S+$/

Конечно, это будет соответствовать вещам, которые не являются действительными адресами электронной почты, но это вопрос игры с правилом 90/10.

303
ответ дан 4 revs, 4 users 67% 15 August 2018 в 14:36
поделиться
  • 1
    Он не соответствует foobar @ dk, который является действительным и рабочим адресом электронной почты (хотя, вероятно, большинство почтовых серверов его не принимают или добавят something.com.) – bortzmeyer 14 October 2008 в 20:30
  • 2
    Да, это будет. Я предлагаю вам попробовать сами. $ perl -le'print q{foo@bar.co.uk} = ~ /^\S+@\S+\.\S+$/? q {Y}: q {N} ' – Andy Lester 6 March 2009 в 05:51
  • 3
    @Richard: . включен в \S. – David Thornley 17 December 2009 в 19:48
  • 4
    JJJ: Да, это будет соответствовать множеству дерьма. Он будет соответствовать & amp; $ * # $ (@ $ 0 (%)) $ #.) & Amp; *) (* $, тоже. Для меня я больше заинтересован в том, чтобы поймать одинаковую черту fumble-finger, такую ​​как mary@aolcom чем я полный мусор. YMMV. – Andy Lester 16 October 2012 в 17:03
  • 5
    Просто для управления знаками @: /^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/ jsfiddle.net/b9chris/mXB96 – Chris Moschini 4 August 2014 в 22:32

Одно простое регулярное выражение, которое, по крайней мере, не отклоняло бы какой-либо действительный адрес электронной почты, будет проверять что-то, а затем знак @, а затем что-то, за которым следует период и как минимум 2 somethings. Он ничего не отклонит, но после рассмотрения спецификации я не могу найти письмо, которое было бы действительным и отклонено.

email = ~ /.+@[^@]+\.[^@]{2,}$/

33
ответ дан 5 revs, 3 users 86% 15 August 2018 в 14:36
поделиться
  • 1
    Это то, что я искал. Не очень ограничительный, но убедитесь, что есть только 1 @ (поскольку мы разбираем список и хотим убедиться, что нет запятых). FYI, вы можете иметь @ слева, если он находится в кавычках: Valid_email_addresses , но это довольно банально. – Josh 11 November 2011 в 08:16
  • 2
    После использования он понял, что он не работает точно. /^[^@]+@[^@]+\.[^@]{2}[^@]*$/ фактически проверяет знак 1 @. Ваше регулярное выражение будет пропускать несколько из-за. * В конце. – Josh 11 November 2011 в 08:31
  • 3
    Правильно. Я не пытаюсь отклонить все недействительные, просто не отказывайтесь от действительного адреса электронной почты. – spig 14 November 2011 в 19:48
  • 4
    Было бы гораздо лучше использовать это: /^[^@]+@[^@]+\.[^@]{2,4}$/, чтобы убедиться, что он заканчивается от 2 до 4 символов, отличных от @. Поскольку @Josh указал, что теперь он позволяет дополнительно @ в конце. Но вы также можете изменить это: /^[^@]+@[^@]+\.[^a-z-A-Z]{2,4}$/, поскольку все домены верхнего уровня являются символами a-Z. вы можете заменить 4 на 5 или больше, чтобы доменные имена верхнего уровня были длиннее и в будущем. – FLY 14 January 2013 в 12:51
  • 5
    @FLY, ka @ foo. возвращается правильно. Предполагается ли это, по стандартам? – SexyBeast 22 November 2015 в 02:31

Стандарт RFC 5322:

Разрешает локальную часть локализованной части узловой точки, локальную часть с кавычками, устаревшую (смешанную точку-атом и котировку) локальную часть домена домена (IPv4) , IPv6 и IPv4-адрес IPv6), доменный литерал и (вложенные) CFWS.

'/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD'

Стандарт RFC 5321:

Позволяет локализовать локальную часть dot-atom локальная часть -string, домен доменного имени и (IPv4, IPv6 и IPv4-адрес IPv6) доменного литерала.

'/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!"?(?>\\\[ -~]|[^"]){65,}"?@)(?>([!#-\'*+\/-9=?^-~-]+)(?>\.(?1))*|"(?>[ !#-\[\]-~]|\\\[ -~])*")@(?!.*[^.]{64,})(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?2)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?3)){7}|(?!(?:.*[a-f0-9][:\]]){8,})((?3)(?>:(?3)){0,6})?::(?4)?))|(?>(?>IPv6:(?>(?3)(?>:(?3)){5}:|(?!(?:.*[a-f0-9]:){6,})(?5)?::(?>((?3)(?>:(?3)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?6)){3}))\])$/iD'

Basic:

Позволяет dot-atom локальная часть и домен доменного имени (требуется, по меньшей мере, две метки имен доменов с TLD, ограниченным 2-6 алфавитными символами).

"/^(?!.{255,})(?!.{65,}@)([!#-'*+\/-9=?^-~-]+)(?>\.(?1))*@(?!.*[^.]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?\.){1,126}[a-z]{2,6}$/iD"
11
ответ дан 58 revs, 2 users 98% 15 August 2018 в 14:36
поделиться
  • 1
    Что такое дьявольский язык? Я вижу флаг /D, и вы цитировали его с одинарными кавычками, но также использовали косые черты, чтобы разграничить шаблон? Это не Perl, и это не может быть PCRE. Это поэтому PHP? Я считаю, что это единственные три, которые позволяют рекурсию, например (?1). – tchrist 7 November 2010 в 21:32
  • 2
    Это в PHP, который использует PCRE. Сляки используются только для выделения специальных символов, таких как скобки, квадратные скобки и, конечно, слэши и одинарные кавычки. Флаг / D, если вы не знаете, заключается в том, чтобы добавить новую строку в конец строки, что было бы разрешено иначе. – MichaelRushton 19 February 2011 в 19:24

Per спецификация W3C HTML5 :

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

Контекст:

Действительный адрес электронной почты - это строка, которая соответствует ABNF production [...].

Примечание. Это требование является преднамеренным нарушением в RFC 5322 , который определяет синтаксис адресов электронной почты, который является одновременно слишком строгий (до символа «@»), слишком неопределенный (после символа «@») и слишком слабый (позволяющий использовать комментарии, пробельные символы и кавычки в манерах, незнакомых большинству пользователей).

Следующее регулярное выражение, совместимое с JavaScript и Perl, является реализацией указанного выше определения.

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

245
ответ дан 6 revs, 6 users 66% 15 August 2018 в 14:36
поделиться
  • 1
    Это интересно. Это нарушение RFC, но умышленное, и это делает sesne. Пример реального мира: gmail игнорирует точки в части до @, поэтому, если ваша электронная почта test@gmail.com, вы можете отправлять электронные письма для тестирования. @ Gmail.com или test .... @ gmail.com, оба этих адреса недействительным в соответствии с RFC, но действительным в реальном мире. – valentinas 16 January 2013 в 07:04
  • 2
    @mmmmmm john.doe@localhost. Конечно, в приложении реального мира (т. Е. Сообщество), я бы хотел, чтобы вы предложили заменить * на + – rabudde 1 February 2013 в 12:03
  • 3
    @valentinas На самом деле RFC делает not исключение этих локальных частей, но их нужно указывать. "test...."@gmail.com отлично действует в соответствии с RFC и семантически эквивалентно test....@gmail.com. – Rinke 17 November 2014 в 10:01
  • 4
    Просто хочу на мгновение взорвать свою собственную трубу - я написал образец в спецификации. – Synchro 20 November 2014 в 22:19
  • 5
    Это правильный ответ и должен быть наверху. Здесь должен быть какой-то механизм, который фиксирует такие случаи, когда тема привлекает так много внимания и голосов, чтобы не дать правильному ответу признать должным образом. – avnr 11 June 2015 в 18:39

[ОБНОВЛЕНО] Я собрал все, что я знаю о проверке адреса электронной почты здесь: http://isemail.info , который теперь не только проверяет, но и диагностирует проблемы с адресами электронной почты. Я согласен со многими комментариями здесь, что валидация является лишь частью ответа; см. мое эссе в http://isemail.info/about .

is_email () остается, насколько я знаю, единственным валидатором, который окончательно скажет вам, будет ли данный строка является действительным адресом электронной почты или нет. Я загрузил новую версию на http://isemail.info/

Я собрал тестовые примеры от Cal Henderson, Dave Child, Phil Haack, Doug Lovell, RFC5322 и RFC 3696. Всего 275 тестовых адресов. Я проверил все эти тесты со всеми бесплатными валидаторами, которые мог найти.

Я постараюсь сохранить эту страницу в актуальном состоянии, так как люди повышают эффективность своих валидаторов. Спасибо Cal, Michael, Dave, Paul и Phil за помощь и сотрудничество в компиляции этих тестов и конструктивной критике моего собственного валидатора .

Люди должны знать о ошибки в RFC 3696 в частности. Три из канонических примеров на самом деле являются неверными адресами. И максимальная длина адреса составляет 254 или 256 символов, а не 320.

282
ответ дан 8 revs, 3 users 96% 15 August 2018 в 14:36
поделиться
  • 1
    можете ли вы добавить один из моего сообщения в него? это от электронной почты действительны? – Evan Carroll 27 January 2010 в 17:52
  • 2
    Вы можете быть более конкретным, Эван? – Dominic Sayers 6 February 2010 в 18:23
  • 3
    Этот валидатор также кажется правильным. [... время проходит ...] Хм, похоже, что это просто RFC 5322, а не 3693 или ошибки. – tchrist 7 November 2010 в 21:11
  • 4
    На данный момент эта ссылка is_email () нарушена ... – Yahel 14 March 2011 в 21:06
  • 5
    Очень хорошо. Здесь мы получаем не только хорошее эссе, но и тестер проверки, а также библиотеку для загрузки. Хороший ответ! – bgmCoder 9 April 2013 в 21:49

Это зависит от того, что вы имеете в виду: если вы говорите об улавливании каждого допустимого адреса электронной почты, используйте следующее:

(?:(?:\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*)

( http: //www.ex-parrot .com / ~ pdw / Mail-RFC822-Address.html ) Если вы ищете что-то более простое, но это поймает большинство действительных адресов электронной почты, попробуйте что-то вроде:

"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"

EDIT: Из ссылки:

Это регулярное выражение будет проверять только те адреса, которые были отмечены и заменены пробелами (это выполняется модулем).

322
ответ дан 8 revs, 6 users 91% 15 August 2018 в 14:36
поделиться
  • 1
    Он не соответствует всем адресам, некоторые должны быть преобразованы первыми. Из ссылки: «Это регулярное выражение будет проверять только адреса, у которых были сняты любые комментарии и заменены пробелами (это выполняется модулем). & Quot; – Chas. Owens 6 April 2009 в 01:18
  • 2
    Можете ли вы привести мне пример некоторого email address, который неправильно проходит через второй, но попадает в более длинное регулярное выражение? – Lazer 15 May 2010 в 19:32
  • 3
    Многое, хотя я когда-то любил его, это валидатор RFC 822, а не RFC 5322 . – tchrist 7 November 2010 в 21:17
  • 4
    @Lazer in..valid @ example.com был бы простым примером. Вам не разрешено иметь две последовательные некотируемые точки в локальной части. – Randal Schwartz 6 December 2011 в 20:04
  • 5
    @Mikhail perl, но вы не должны его использовать. – Good Person 8 January 2013 в 20:48

Cal Henderson (Flickr) написал статью под названием Parsing Email Adresses в PHP и показывает, как правильно выполнять RFC (2) 822-совместимый анализ адресов электронной почты. Вы также можете получить исходный код в php , python и ruby, который является cc лицензированным .

42
ответ дан adnam 15 August 2018 в 14:36
поделиться
  • 1
    он сказал мне, что a@b действителен – dsdsdsdsd 16 April 2014 в 12:44
  • 2
    @dsdsdsdsd Поскольку a@b допустимо ... в этом случае b является доменом верхнего уровня. – rink.attendant.6 31 July 2015 в 21:19

Не говоря уже о том, что в будущем в будущем должны быть разрешены нелатинские (китайские, арабские, греческие, ивриты, кириллицы и т. д.) имена доменов. Каждый должен изменить используемое регулярное выражение электронной почты, потому что эти символы, несомненно, не будут покрываться [a-z]/i и \w. Все они потерпят неудачу.

В конце концов, лучший способ проверить адрес электронной почты по-прежнему на самом деле отправить письмо на адрес, о котором идет речь, для проверки адреса. Если адрес электронной почты является частью аутентификации пользователя (register / login / etc), вы можете идеально комбинировать его с системой активации пользователя. То есть отправьте электронное письмо со ссылкой с уникальным ключом активации на указанный адрес электронной почты и разрешите только регистрацию, когда пользователь активировал вновь созданную учетную запись, используя ссылку в письме.

Если целью регулярного выражения является просто для того, чтобы быстро сообщить пользователю в пользовательском интерфейсе, что указанный адрес электронной почты не выглядит в нужном формате, лучше всего проверить, соответствует ли оно в основном следующее регулярное выражение:

^([^.@]+)(\.[^.@]+)*@([^.@]+\.)+([^.@]+)$

, Почему бы вам не беспокоиться о персонажах, используемых в названии и домене? Клиент обязан ввести правильный адрес электронной почты, а не сервер. Даже когда клиент входит в синтаксически действительный адрес электронной почты, такой как aa@bb.cc, это не гарантирует, что это законный адрес электронной почты. Никакое регулярное выражение не может покрыть это.

22
ответ дан BalusC 15 August 2018 в 14:36
поделиться
  • 1
    Я согласен, что отправка сообщения аутентификации, как правило, является лучшим способом для такого рода материалов, синтаксически корректными и действительными - не то же самое. Я расстраиваюсь, когда мне приходится дважды вводить адрес электронной почты для «Подтверждения». как будто я не могу смотреть на то, что я набрал. Во всяком случае, я только копирую первый во второй, он, кажется, все больше используется. – PeteT 2 February 2010 в 16:05
  • 2
    @DaveJarvis (и @PeteT) - Я согласен. Тогда есть те (ужасные) сайты (как правило, банки и такие), которые отключают «копировать». и "паста" на их страницах. Arrgh! – Kevin Fegan 26 September 2016 в 21:25
  • 3
    дать согласие! но это регулярное выражение, которое я считаю недействительным, потому что оно позволяет spaces после @., например. test@test.ca com net рассматривает действительное электронное письмо, используя указанное выше регулярное выражение, где оно должно возвращаться недействительным. – CB4 8 November 2017 в 18:54

Вы можете использовать тот, который используется плагином jQuery Validation:

/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i
30
ответ дан chaos 15 August 2018 в 14:36
поделиться
  • 1
    это, кажется, делает хорошую работу. Это позволило: a-b'c_d.e@f-g.h, но удалось поймать несоответствующие изменения, такие как a-b'c_d.@f-g.h и a-b'c_d.e@f-.h – dsdsdsdsd 16 April 2014 в 12:52

Адреса электронной почты, которые я хочу проверить, будут использоваться веб-приложением ASP.NET с использованием пространства имен System.Net.Mail для отправки электронных писем в список людей. Поэтому вместо того, чтобы использовать какое-то очень сложное регулярное выражение, я просто пытаюсь создать экземпляр MailAddress с адреса. Контрактор MailAddress генерирует исключение, если адрес не сформирован должным образом. Таким образом, я знаю, что, по крайней мере, я могу получить электронную почту за дверью. Конечно, это проверка на стороне сервера, но, как минимум, вам это нужно.

protected void emailValidator_ServerValidate(object source, ServerValidateEventArgs args)
{
    try
    {
        var a = new MailAddress(txtEmail.Text);
    }
    catch (Exception ex)
    {
        args.IsValid = false;
        emailValidator.ErrorMessage = "email: " + ex.Message;
    }
}
105
ответ дан davcar 15 August 2018 в 14:36
поделиться
  • 1
    Хороший момент. Даже если эта проверка сервера отклоняет какой-либо действительный адрес, это не проблема, так как вы не сможете отправлять этот адрес с использованием этой конкретной серверной технологии. Или вы можете попробовать сделать то же самое, используя стороннюю библиотеку электронной почты, которую вы используете, вместо стандартных инструментов. – User 16 June 2009 в 11:59
  • 2
    Мне очень нравится, как это использует .Net framework code - нет смысла изобретать колесо. Это отлично. Простой, чистый и гарантирует, что вы действительно можете отправить электронное письмо. Отличная работа. – Cory House 15 August 2010 в 20:43
  • 3
    ... да, и для тех, кто интересуется тем, как он проверяет, взгляните на код в Reflector - это совсем немного - и это не регулярное выражение! – Tom Carter 17 September 2010 в 09:07
  • 4
    Просто заметьте: класс MailAddress не соответствует RFC5322, если вы просто хотите использовать его для проверки (и не отправляете также, в этом случае это спорный вопрос, как указано выше). См. stackoverflow.com/questions/6023589/… – porges 31 May 2011 в 06:06

При принятии решения о том, какие символы разрешены, помните своих апострофов и друзей с переносом. Я не контролирую тот факт, что моя компания генерирует мой адрес электронной почты, используя мое имя из системы HR. Это включает апостроф в моей фамилии. Я не могу сказать, сколько раз я был заблокирован от взаимодействия с веб-сайтом из-за того, что мой адрес электронной почты «недействителен».

61
ответ дан DOK 15 August 2018 в 14:36
поделиться
  • 1
    Это очень распространенная проблема в программах, которые делают необоснованные предположения о том, что есть и не разрешено в имени человека. Не следует делать таких предположений, просто принимайте любого персонажа, который, по мнению RFC (s), должен быть указан. – tchrist 7 November 2010 в 21:22
  • 2
    Да. Меня особенно раздражает программисты, отклоняющие заглавные буквы в адресах электронной почты! Глупый и / или ленивый. – PhiLho 29 October 2012 в 17:26

Есть много примеров этого в сети (и я думаю, что даже тот, который полностью проверяет RFC), но это десятки / сотни строк, если память используется). Люди склонны увлекаться проверкой такого рода вещей. Почему бы просто не проверить, что у него есть @ и по крайней мере один. и соответствует некоторой простой минимальной длине. Тривиально вводить поддельное письмо и все равно соответствовать любому действительному регулярному выражению. Я бы предположил, что ложные срабатывания лучше ложных негативов.

70
ответ дан Draemon 15 August 2018 в 14:36
поделиться

Для наиболее полной оценки лучшего регулярного выражения для проверки адреса электронной почты см. эту ссылку; " Сравнение адреса электронной почты Проверка регулярных выражений "

Вот текущее верхнее выражение для ссылочных целей:

/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i
24
ответ дан Eric Schoonover 15 August 2018 в 14:36
поделиться
  • 1
    spoon16: Эта ссылка не совсем правильная. Его утверждение о том, что не может быть идеального шаблона для проверки адресов электронной почты, является явно ошибкой. Вы можете , но вы должны следить за тем, чтобы вы следовали RFC вплоть до буквы. И вам тоже нужно выбрать правильный RFC. – tchrist 7 November 2010 в 21:27
  • 2
    «Лучший» прямо сейчас не работает с java regex - даже после правильного экранирования и преобразования строки. – Eric Chen 17 April 2012 в 21:57

Для яркой демонстрации, следующий монстр довольно хорош, но по-прежнему неправильно распознает все синтаксически допустимые адреса электронной почты: он распознает вложенные комментарии до четырех уровней в глубину.

Это задание для синтаксического анализатора , но даже если адрес синтаксически действителен, он все равно может быть невозможен. Иногда вам приходится прибегать к методу Hillbilly «Эй, y'all, смотреть ee-us!»

// derivative of work with the following copyright and license:
// Copyright (c) 2004 Casey West.  All rights reserved.
// This module is free software; you can redistribute it and/or
// modify it under the same terms as Perl itself.

// see http://search.cpan.org/~cwest/Email-Address-1.80/

private static string gibberish = @"
(?-xism:(?:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(?-xism:(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+
|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<DQ>(?-xism:(?-xism:[
^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D])))+<DQ>(?-xism:(?-xi
sm:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xis
m:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\
s*)+|\s+)*))+)?(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?
-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*<(?-xism:(?-xi
sm:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^(
)\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(
?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))
|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<
>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]
+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))
|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:
(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s
*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?
:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x
0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xi
sm:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*
<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D]
)))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\
]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-x
ism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+
)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:(
?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?
-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s
*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+(
?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism:
\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[
^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)
+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-x
ism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-xi
sm:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:
\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(
?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+
)*\s*\)\s*)+|\s+)*)))>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-
xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\
s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^
\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))|(?-xism:(?-x
ism:(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^
()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*
(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D])
)|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()
<>\[\]:;@\,.<DQ>\s]+(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s
]+)*)(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+)
)|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism
:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\
s*\)\s*))+)*\s*\)\s*)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((
?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\
x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-x
ism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)
*<DQ>(?-xism:(?-xism:[^\\<DQ>])|(?-xism:\\(?-xism:[^\x0A\x0D
])))+<DQ>(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\
\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-
xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)
+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*))\@(?-xism:(?-xism:(?-xism:
(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(
?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[
^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\
s*\)\s*)+|\s+)*(?-xism:[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+
(?:\.[^\x00-\x1F\x7F()<>\[\]:;@\,.<DQ>\s]+)*)(?-xism:(?-xism
:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:
[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+
))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*
)+|\s+)*)|(?-xism:(?-xism:(?-xism:\s*\((?:\s*(?-xism:(?-xism
:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\(
(?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A
\x0D]))|)+)*\s*\)\s*))+)*\s*\)\s*)+|\s+)*\[(?:\s*(?-xism:(?-
xism:[^\[\]\\])|(?-xism:\\(?-xism:[^\x0A\x0D])))+)*\s*\](?-x
ism:(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism
:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:\s*(?-xism:(?-xism:
(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|)+)*\s*\)\s*))
+)*\s*\)\s*)+|\s+)*))))(?-xism:\s*\((?:\s*(?-xism:(?-xism:(?
>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0D]))|(?-xism:\s*\((?:
\s*(?-xism:(?-xism:(?>[^()\\]+))|(?-xism:\\(?-xism:[^\x0A\x0
D]))|)+)*\s*\)\s*))+)*\s*\)\s*)*)"
  .Replace("<DQ>", "\"")
  .Replace("\t", "")
  .Replace(" ", "")
  .Replace("\r", "")
  .Replace("\n", "");

private static Regex mailbox =
  new Regex(gibberish, RegexOptions.ExplicitCapture); 
15
ответ дан Greg Bacon 15 August 2018 в 14:36
поделиться

Странно, что вы «не можете» разрешать TLD с 4 символами. Вы запрещаете людей из .info и .name , а ограничение длины останавливается .travel и .museum , но да, они менее распространены, чем 2-х символов TLD и 3-символьные TLD.

Вы также должны использовать прописные буквы. Системы электронной почты нормализуют локальную часть и часть домена.

Для вашего регулярного выражения части домена имя домена не может начинаться с '-' и не может заканчиваться на '-'. Dash может находиться только между ними.

Если вы использовали библиотеку PEAR, проверьте их функцию почты (забыли точное имя / библиотеку). Вы можете проверить адрес электронной почты, вызвав одну функцию, и проверяет адрес электронной почты в соответствии с определением в RFC822.

8
ответ дан Joseph Yee 15 August 2018 в 14:36
поделиться

Я никогда не беспокоюсь о создании с помощью своего собственного регулярного выражения, потому что есть вероятность, что кто-то еще придумал лучшую версию. Я всегда использую regexlib , чтобы найти его по своему вкусу.

41
ответ дан Kon 15 August 2018 в 14:36
поделиться

Вот PHP, который я использую. Я выбрал это решение в духе «ложных срабатываний лучше ложных негативов», как заявил другой комментатор здесь И, чтобы сохранить время ответа и нагрузку на сервер ... нет необходимости тратить ресурсы сервера на регулярное выражение, когда это избавит вас от самой простой ошибки пользователя. Вы всегда можете следить за этим, отправив тестовое письмо, если хотите.

function validateEmail($email) {
  return (bool) stripos($email,'@');
}
11
ответ дан Mac 15 August 2018 в 14:36
поделиться
  • 1
    a) «Ресурсы отработанного сервера» является бесконечно малым, но если вы так склонны, вы можете сделать это на стороне клиента с помощью JS. b) Что вам нужно, чтобы отправить регистрационную почту, и пользователь вошел мне в @potothedotcom? Ваше & quot; решение & quot; терпит неудачу, и вы потеряете пользователя. – johnjohn 3 April 2012 в 10:40
  • 2
    a) Опираясь на проверку JS, которая не удалась при отключении JavaScript, не кажется лучшей идеей (просто btw) – auco 6 December 2013 в 17:39

Вы не должны использовать регулярные выражения для проверки адресов электронной почты.

Вместо этого используйте класс MailAddress , например:

try {
    address = new MailAddress(address).Address;
} catch(FormatException) {
    //address is invalid
}

MailAddress класс использует синтаксический анализатор BNF для проверки адреса в полном соответствии с RFC822.

Если вы действительно хотите использовать регулярное выражение, здесь :

(?:(?:\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*)
704
ответ дан Yahel 15 August 2018 в 14:36
поделиться
  • 1
    Слэкс: Мне очень жаль. Похоже, что то, что выглядело так, было очень полезным, было разрушено. Я не уверен, что случилось, но я подозреваю, что ты, возможно, ушел, а твоя кошка спала на твоей клавиатуре. Вы можете отредактировать его, когда получите шанс. Не волнуйся, это случается с лучшими из нас. – Matt Simmons 15 December 2009 в 04:33
  • 2
    Вы обнаружите, что класс MailAddress в .NET 4.0 намного лучше проверяет адреса электронной почты, чем в предыдущих версиях. Я сделал некоторые существенные улучшения. – Jeff Tucker 15 December 2009 в 10:56
  • 3
    Я думаю, что это ... не работает ... для более простых идентификаторов. a @ b не проверяет. ar@b.com соответствует только до ar @ b, .com не сопоставляется. Однако что-то вроде «Я есть я» @ [10.10.10.10] действительно работает! :) – Raze 15 December 2009 в 12:24
  • 4
    @MatthewLock: Это не хуже, чем fake@not-a-real-domain.name. Вы не должны полагаться на проверку электронной почты, чтобы предотвратить XSS. – SLaks 28 September 2012 в 18:19
  • 5
    @MatthewLock: Нет. Вам нужно escape SQL-запросы (или, еще лучше, использовать параметры). Санитация не является надлежащей защитой. – SLaks 2 March 2016 в 15:49

Как вы пишете на PHP, я бы посоветовал вам использовать проверку встроенного PHP для писем.

filter_var($value, FILTER_VALIDATE_EMAIL)

Если вы используете версию php ниже 5.3.6 помните об этой проблеме: https://bugs.php.net/bug.php?id=53091

Если вы хотите получить дополнительную информацию о том, как работает эта проверка подлинности в buid-in , см. здесь: Действительно ли работает PHP filter_var FILTER_VALIDATE_EMAIL?

137
ответ дан 2 revs 15 August 2018 в 14:36
поделиться
  • 1
    Насколько мне известно, некоторые библиотеки тоже ошибаются. Я смутно помню, что у PHP PEAR была такая ошибка. – bortzmeyer 14 October 2008 в 15:34
  • 2
    Ах, ну да. Если вы скажете, что никто не идеален, некоторые реализации по-прежнему будут ближе к совершенству, чем другие :) – Chris Vest 14 October 2008 в 15:36
  • 3
    Эта страница также имеет оговорку внизу о нескольких вещах из спецификации. что регулярное выражение не поддерживает. – Chris Vest 14 October 2008 в 15:37
  • 4
    Это спецификация RFC 822, а не спецификация RFC 5322 . – tchrist 7 November 2010 в 21:12
  • 5
    В конечном счете, он прав в том, что единственный способ действительно проверить адрес электронной почты - отправить ему электронное письмо и ждать ответа. – Blazemonger 26 October 2011 в 20:43
  • 6
    получает голосование, именно то, что я собирался сказать. Не обрабатывает IDN, но конвертирование в ненадежный код заранее разрешает это. PHP & gt; = 5.3 имеет idn_to_ascii () для этого. Один из лучших и простых способов проверки электронной почты. – Taylor 26 January 2012 в 01:00

Не знаю о лучшем, но этот , по крайней мере, правильный, если адреса имеют свои комментарии, разделенные и замененные пробелами.

Серьезно. Вы должны использовать уже написанную библиотеку для проверки электронной почты. Лучшим способом, вероятно, является просто отправить электронное письмо с подтверждением на этот адрес.

137
ответ дан 2 revs 15 August 2018 в 14:36
поделиться
  • 1
    Насколько мне известно, некоторые библиотеки тоже ошибаются. Я смутно помню, что у PHP PEAR была такая ошибка. – bortzmeyer 14 October 2008 в 15:34
  • 2
    Ах, ну да. Если вы скажете, что никто не идеален, некоторые реализации по-прежнему будут ближе к совершенству, чем другие :) – Chris Vest 14 October 2008 в 15:36
  • 3
    Эта страница также имеет оговорку внизу о нескольких вещах из спецификации. что регулярное выражение не поддерживает. – Chris Vest 14 October 2008 в 15:37
  • 4
    Это спецификация RFC 822, а не спецификация RFC 5322 . – tchrist 7 November 2010 в 21:12
  • 5
    В конечном счете, он прав в том, что единственный способ действительно проверить адрес электронной почты - отправить ему электронное письмо и ждать ответа. – Blazemonger 26 October 2011 в 20:43
Другие вопросы по тегам:

Похожие вопросы: