2014-01-17 2 views
0

Я пытаюсь проверить электронную почту (UTF8), используя следующее регулярное выражениеНеактивированные UTF8 символов на основе электронных писем

Regex.IsMatch(emailAddress, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.CultureInvariant);

Он возвращает ложь для «ä[email protected]».

Любые предложения по его улучшению.

+1

См. Http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address – StevieB

+2

Проверка подлинности с помощью регулярного выражения сложнее, чем кажется: http: // stackoverflow .com/a/201378/1283847 – Leri

+0

@StevieB спасибо, что я уже прошел через ссылку. Но я думал, что установка опции «RegexOptions.CultureInvariant» и указание «\ w» в regex будет проверять все слова UTF8. – user3205838

ответ

0
  1. UTF-8 не имеет ничего общего с этим, вы проверяете строку, а не ее конкретную кодировку.

  2. Ваше Regex действительно возвращает true для [email protected]" (с опцией CultureInvariant) или без него. Попробуйте Console.Write(Regex.IsMatch("ä[email protected]", @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.CultureInvariant)); самостоятельно, и вы получите true.

  3. Вы не сработаете на всех IDN, таких как [email protected]ουτοπία.δπθ.gr, и если вам небезразличен адрес электронной почты, не ограниченный ASCiI, вы можете включить их. (И если вы хотите исключить запрещенные путаницы, вы становитесь очень сложными).

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

  1. Фактический синтаксис электронной почты является более сложным, чем думают люди (еще до того, мы имеем дело с расширениями, отличными от ASCII). например вы знаете, что Abc\@[email protected] является действительным адресом электронной почты? Фактически, это пример действительного адреса, приведенного в RFC 3696.

  2. Если вы приступите к созданию идеального валидатора (это возможно), это будет пустой тратой усилий. Скорее всего, ваше почтовое программное обеспечение не будет обрабатывать их всех (например, Abc\@[email protected] выше не будет работать с большим количеством программного обеспечения), тогда количество действительных адресов электронной почты на самом деле не будет правильным.

Но в любом случае, я получаю true работает ваш код, то ошибка в другом месте.

+0

Спасибо за то, что указали мне в правильном направлении, я получал неправильную строку электронной почты из-за проблемы с кодировкой. – user3205838

0

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

Ответ на ваш конкретный вопрос заключается в том, что если вы готовы заблокировать действительные адреса и разрешить недействительные, вы должны использовать [\p{L}\p{M}\p{N}], а не \w, чтобы соответствовать символам слова Юникод в части имени пользователя.

+0

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

+0

Полный юридический синтаксис адресов электронной почты делает невероятно сложным регулярное выражение (простейший RFC-822-совместимый, который я видел, является страницей с половиной длины). Если вы хотите проверить, действителен ли адрес, просто отправьте ему электронное письмо и посмотрите, отскакивает ли он. – Mark

+0

Государственная машина лучше подходит для этой задачи. Конечно, бит более подробный. – StevieB

Смежные вопросы