Регулярное выражение для адреса электронной почты с разделителями - PullRequest
12 голосов
/ 04 декабря 2010

Я ищу регулярный экспресс для проверки списка адресов электронной почты, таких как:

test1@abd.com;test.test@abc.com;test3@test.com

и

test1@abd.com;test.test@abc.com;test3@test.com;

необязательный ";"в конце списка.

спасибо,

Ответы [ 7 ]

16 голосов
/ 04 декабря 2010

От: http://regexlib.com/RETester.aspx?regexp_id=1007

^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$
7 голосов
/ 01 февраля 2011

«Вы называете , что ножом?» - Крокодил Данди

На самом деле, все это очень плохие шаблоны для сопоставления почтового адреса. Чтобы строго проверить адрес электронной почты RFC 5322 с нулем ложными отрицаниями и нулями ложными срабатываниями, вам нужен точный шаблон:

  (?x)

  (?(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)  # finally, match a mail address

Я обсуждаю это более подробно в этом ответе .

Для правильной работы требуется библиотека Perl-совместимых регулярных выражений (PCRE) или сам Perl. Я не могу гарантировать, что движки несовместимых шаблонов perl будут правильно обрабатывать рекурсию.

2 голосов
/ 18 февраля 2018

@ Ответ Эвана близок, но выражение соответствует недопустимым сценариям:

  1. a@test.comb@test.comc@test.com (без разделителей)
  2. a@test.com;b@test.com.c@test.com (период . принятов качестве разделителя)
  3. a@test.com;b@test.comc@test.com (соответствует только 1-й разделитель - расширение задачи # 1)

Чтобы исправить это (и немного упростить), я внес следующие изменения:

  1. Убрал 3-й знак + и внешние символы (), окружающие первый адрес электронной почты.
  2. Измените [;.] на простой ; разделитель - я фактически изменилэтой части до ;[ ]{0,1}, потому что я хотел, чтобы выражение совпадало с пробелами после разделителя точки с запятой.
  3. Аналогично # 1, удалите последний знак + в выражении, а внешние парены ()между разделителем (шаг # 2) и последним закрывающим элементом со звездочкой после него - )*

Вот окончательное выражение (допускается дополнительный пробел после разделителя ;:

/^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25}(;[ ]{0,1}([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})*$/
1 голос
/ 06 октября 2017

Я использую это:

^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25}(($)|( *;+ *$)|( *;+ *(?=[a-zA-Z0-9_\-\.]))))*$

https://regexr.com/3gth7

1 голос
/ 14 августа 2017

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

^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+(\s*[;.]\s*(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$

Проверьте его по адресу: http://regexlib.com/RETester.aspx?regexp_id=13126

0 голосов
/ 04 декабря 2010

вот еще один ^ (0-9a-zA-Z @ ([0-9a-zA-Z] [- \ w] [0-9a-zA-Z].) + [A-Za-Z] {2,9}) $

0 голосов
/ 04 декабря 2010

Смотрите здесь: http://www.regular -expressions.info / email.html

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...