Regexp распознавание адреса электронной почты трудно? - PullRequest
56 голосов
/ 01 октября 2008

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

Кто-нибудь может дать некоторое представление о том, почему это так?

Существуют ли известные и проверенные регулярные выражения, которые действительно делают это полностью?

Какие есть хорошие альтернативы использованию регулярных выражений для сопоставления адресов электронной почты?

Ответы [ 19 ]

3 голосов
/ 03 октября 2008

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

^[a-zA-Z]([.]?([a-zA-Z0-9_-]+)*)?@([a-zA-Z0-9\-_]+\.)+[a-zA-Z]{2,4}$ 

Это не пуленепробиваемый, и, конечно, не охватывает всю спецификацию электронной почты, но он выполняет достойную работу по удовлетворению большинства основных требований Более того, он несколько понятен и может быть отредактирован.

Извлечено из обсуждения на HouseOfFusion.com , ресурс ColdFusion мирового класса.

2 голосов
/ 31 декабря 2009

Если вы работаете в .NET Framework, попробуйте создать экземпляр объекта MailAddress и поймать FormatException, если он взорвется, или вытащить Address, если это удастся. Не вдаваясь в какую-то чушь о производительности перехвата исключений (на самом деле, если это всего лишь одна веб-форма, это не будет иметь большого значения), класс MailAddress в .NET Framework проходит довольно завершить процесс синтаксического анализа (он не использует RegEx). Откройте Reflector и найдите MailAddress и MailBnfHelper.ReadMailAddress(), чтобы увидеть все интересные вещи, которые он делает. Кто-то умнее меня потратил много времени на создание этого парсера в Microsoft, и я собираюсь использовать его, когда отправлю электронное письмо на этот адрес, поэтому я мог бы также использовать его для проверки входящего адреса.

2 голосов
/ 01 октября 2008

Это действительно сложно, потому что есть много вещей, которые могут быть действительными в адресе электронной почты в соответствии со спецификацией электронной почты RFC 2822 . Вещи, которые вы обычно не видите, такие как +, являются абсолютно допустимыми символами для адреса электронной почты .. согласно спецификации.

Целый раздел, посвященный адресам электронной почты на http://regexlib.com,, является отличным ресурсом. Я бы посоветовал вам определить, какие критерии важны для вас, и найти тот, который соответствует. Большинству людей действительно не нужна полная поддержка всех возможностей, предусмотренных спецификацией.

1 голос
/ 11 марта 2010

Этот класс для Java содержит валидатор: http://www.leshazlewood.com/?p=23

Это написано создателем Сиро (формально Ки, формально JSecurity)

Плюсы и минусы проверки правильности адреса электронной почты:

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

  1. Слишком свободные.
  2. Слишком строгие.

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

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

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

1 голос
/ 01 октября 2008

Попробуйте это:

"(?:[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])+)\])"

Посмотрите здесь для деталей.

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

1 голос
/ 01 октября 2008

Многие пытались, и многие подошли ближе. Вы можете прочитать статью в Википедии и некоторые другие .

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

0 голосов
/ 01 октября 2008

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

Для PHP Используйте хороший filter_var с определенным типом проверки EMAIL:)

Нет больше безумных регулярных выражений в php: D

var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));

http://www.php.net/filter_var

0 голосов
/ 01 октября 2008

Добавление к Уэйну s ответа, а также раздел www.regular-expressions.info , посвященный электронной почте, с несколькими образцами.

Вы всегда можете спросить, стоит ли это того или иного факта. любое регулярное выражение с менее чем 100% -ным вкладом только способствует ложному чувству безопасности.

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

0 голосов
/ 01 октября 2008

Кто-нибудь может подсказать, почему это так?

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

Существуют ли известные и проверенные регулярные выражения, которые действительно делают это полностью?

Вот одна попытка полностью разобрать весь стандарт ...

http://ex -parrot.com / ~ PDW / Mail-RFC822-Address.html

Какие есть хорошие альтернативы использованию регулярных выражений для сопоставления адресов электронной почты?

Использование существующего фреймворка для него на любом языке, который вы используете? Хотя те, вероятно, будут использовать регулярные выражения внутри страны. Это сложная строка. Регулярные выражения предназначены для анализа сложных строк, так что это действительно ваш лучший выбор.

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

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