RegEx: Проверки адреса электронной почты

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

Проверка формата адреса электронной почты

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

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

Проверьте, существует ли адрес

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

Поэтому единственный способ проверить, что почта действительна и существует, - это отправить письмо на этот адрес.

Огромные альтернативы Regex

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

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

Модуль сопоставления адресов на Perl

Лучшие примеры таких regex находятся в стандартных библиотеках некоторых языков. Например, в библиотеке Perl есть модуль RFC::RFC822::Address, который старается быть как можно более точным в соответствии с RFC. Для любопытства вы можете найти версию этого regex по этому URL, которая была сгенерирована на основе грамматики, и если у вас возникнет соблазн скопировать ее, вот цитата от автора regex:

"Я не поддерживаю регулярное выражение [связанное]. В нем могут быть ошибки, которые уже исправлены в модуле Perl".

Модуль сопоставления адресов .Net

Другой, более короткий вариант, используется в стандартной библиотеке .Net в модуле EmailAddressAttribute:

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

Модуль подбора адресов в Ruby

В Ruby для подбора адреса в модуле rfc822 используется композиция regex. Это хорошая идея, так как в случае обнаружения ошибок будет проще определить, какую часть regex нужно изменить, и исправить ее.

Модуль Python для сопоставления адресов

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий