Я ищу регулярный экспресс для проверки списка адресов электронной почты, таких как
[email protected];[email protected];[email protected]
и
[email protected];[email protected];[email protected];
optional ";" в конце списка.
спасибо,
Я ищу регулярный экспресс для проверки списка адресов электронной почты, таких как
[email protected];[email protected];[email protected]
и
[email protected];[email protected];[email protected];
optional ";" в конце списка.
спасибо,
От: 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})+)*$
На самом деле, все это очень плохие шаблоны для сопоставления почтового адреса. Чтобы строго проверить почтовый адрес 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) | (?"ed_string))
(?<domain> (?&dot_atom) | (?&domain_literal))
(?<domain_literal> (?&CFWS)? \[ (?: (?&FWS)? (?&dcontent))* (?&FWS)?
\] (?&CFWS)?)
(?<dcontent> (?&dtext) | (?"ed_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) | (?"ed_pair))
(?<quoted_string> (?&CFWS)? (?&DQUOTE) (?:(?&FWS)? (?&qcontent))*
(?&FWS)? (?&DQUOTE) (?&CFWS)?)
(?<word> (?&atom) | (?"ed_string))
(?<phrase> (?&word)+)
# Folding white space
(?<FWS> (?: (?&WSP)* (?&CRLF))? (?&WSP)+)
(?<ctext> (?&NO_WS_CTL) | [\x21-\x27\x2a-\x5b\x5d-\x7e])
(?<ccontent> (?&ctext) | (?"ed_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
Я обсуждаю это более подробно в этом ответе.
Для нормальной работы требуется библиотека Perry Compatible Regular Expression (PCRE) или Perl. Я не могу гарантировать, что perl несовместимые шаблонные двигатели будут правильно обрабатывать рекурсию.
Мне нужно было разрешить присутствие пробела вокруг разделителя, поэтому я использовал эту модификацию ответа Эвана Мулавского:
^(([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
Я использую это:
^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25}(($)|( *;+ *$)|( *;+ *(?=[a-zA-Z0-9_\-\.]))))*$
@Evan близок, но выражение соответствует этим недействительным сценариям:
[email protected]@[email protected]
(без разделителей)[email protected];[email protected]@test.com
(период .
принят как разделитель)[email protected];[email protected]@test.com
(только 1-й разделитель - расширение проблемы №1)Чтобы исправить эти (и немного упростить), я сделал следующие изменения:
+
, а внешние parens ()
окружают первый адрес электронной почты.[;.]
на простой разделитель ;
- я фактически изменил эту часть на ;[ ]{0,1}
, потому что я хотел, чтобы выражение соответствовало пробелам после разделителя с разделителями с запятой.+
в выражении и внешние parens ()
между разделителем (шаг № 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})*$/
Смотрите здесь: http://www.regular-expressions.info/email.html
Страница обсуждает регулярные выражения для проверки одного адреса электронной почты; вы можете легко обобщить предлагаемые там решения, чтобы соответствовать списку с разделителями с запятой.
Существует множество вариантов проверки электронной почты. Я бы избегал тех, которые стараются быть умными и имеют список всех tld, потому что они добавляются довольно регулярно (например, домены .co недавно). Включение списка в ваше регулярное выражение просто вызовет головные боли по линии.
Я попробовал это в вашей строке:
\[email protected][a-zA-Z_]+?\.[a-zA-Z]{2,3}
который я только что снял с regexlib.com и удалил ^ и $в начале и конце.
Если вы запустите это через класс .net Regex, вы должны вернуть MatchCollection, но я не уверен, что вы работаете в .net?
вот еще один ^ (0-9a-Za-Z @([0-9a-Za-Z] [-\ш]. [0-9a-Za-Z]) + [A-Za-Z] {2,9}) $