Как можно валидировать адрес электронной почты с помощью регулярного выражения? Я разработал регулярку, которая работает для большинства email-адресов, но иногда требует доработки (например, добавление поддержки 4-символьных доменов верхнего уровня). Какое лучшее регулярное выражение для валидации email, которое обрабатывает все случаи, включая те, где в качестве серверных частей используются IP-адреса? Я предпочитаю одно сложное выражение вместо нескольких простых для простоты реализации.
Лучший комплексный регулярный выражение для валидации email, который обрабатывает IP-адреса и поддерживает любые длины доменов верхнего уровня (TLD), — это почти полностью соответствующий RFC 5322 шаблон: /^[a-z0-9!#$%&'*+/=?^_~-]+(?:.[a-z0-9!#/i`. Это единое сложное выражение поддерживает стандартные форматы email, домены с IP-адресами в квадратных скобках и учитывает TLD любой длины, сохраняя соответствие RFC для большинства практических случаев использования.
Содержание
- Понимание структуры email-адреса
- Анализ комплексного шаблона регулярного выражения
- Поддержка доменов с IP-адресами
- Обработка TLD и considerations длины
- Примеры реализации
- Ограничения и лучшие практики
- Альтернативные подходы
Понимание структуры email-адреса
Email-адреса следуют спецификации RFC 5322 и состоят из двух основных частей, разделенных символом “@”:
- Локальная часть: Имя пользователя перед символом “@”
- Доменная часть: Имя сервера после символа “@”
Доменная часть может быть:
- Традиционным доменным именем (например,
gmail.com) - IP-адресом в квадратных скобках (например,
[192.168.1.1]) - Доменным литералом для специализированной маршрутизации
Согласно Regular-Expressions.info, “доменная часть может быть точечной атомарной строкой или доменным литералом”, где доменные литералы включают IP-адреса и адреса маршрутизации, специфичные для домена.
Локальная часть поддерживает различные символы, включая буквы, цифры и специальные символы вроде !#$%&'*+-/=?^_~`, с ограничениями на последовательные точки и их расположение в начале или конце.
Анализ комплексного шаблона регулярного выражения
Рекомендуемый комплексный шаблон регулярного выражения для валидации email:
/^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]$/i
Этот шаблон разбивается на две основные части, разделенные оператором ИЛИ (|):
Раздел валидации стандартного домена:
^[a-z0-9!#$%&'*+/=?^_~-]+`: Соответствует локальной части с разрешенными символами(?:\.[a-z0-9!#$%&'*+/=?^_~-]+)*`: Позволяет точки и дополнительные последовательности символов в локальной части@: Литеральный символ “@”(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+: Валидирует структуру домена с дефисами[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$: Обеспечивает правильное завершение домена
Раздел домена с IP-адресом:
\[: Открывающая скобка для литерала IP-адреса(?:[0-9]{1,3}\.){3}[0-9]{1,3}: Валидирует формат IPv4-адреса (0-255.0-255.0-255.0-255)\]: Закрывающая скобка для литерала IP-адреса
Флаг /i делает шаблон нечувствительным к регистру, что позволяет использовать как заглавные, так и строчные буквы в email-адресах.
Поддержка доменов с IP-адресами
IP-адреса в доменах email должны быть заключены в квадратные скобки в соответствии со спецификациями RFC. Например, user@[192.168.1.1] — это допустимый формат email, где доменная часть является литералом IP-адреса.
Шаблон регулярного выражения включает поддержку этого формата через второй альтернативный вариант: \[(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]. Этот конкретно:
- Требует наличия обрамляющих скобок
- Валидирует формат IPv4-адреса с правильными диапазонами октетов (0-255)
- Предотвращает неправильно сформированные IP-адреса вроде
[999.999.999.1]
Как объясняется на Stack Overflow, домен может быть “точечной атомарной строкой или доменным литералом”, где доменные литералы включают IP-адреса в квадратных скобках.
Обработка TLD и considerations длины
Современные TLD вышли за рамки традиционных ограничений в 2-3 символа. Комплексный шаблон обрабатывает это следующим образом:
-
Ограничения длины TLD: В отличие от старых шаблонов, использовавших
{2,}для длины TLD, этот шаблон позволяет TLD любой длины через валидацию структуры домена -
Поддержка новых TLD: Шаблон валидирует TLD вроде
.technology,.engineering,.companyи другие длинные современные TLD -
Поддержка интернационализированных TLD: Хотя этот регулярный фокусируется на ASCII-символах, его можно расширить для поддержки интернационализированных доменных имен (IDN)
Согласно AbstractAPI, “обновить шаблон регулярного выражения для поддержки новых TLD длиной более четырех символов” необходимо для современной валидации email.
Примеры реализации
Реализация на JavaScript
function validateEmail(email) {
const regex = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]$/i;
return regex.test(email);
}
// Тестовые случаи
console.log(validateEmail("user@example.com")); // true
console.log(validateEmail("user@[192.168.1.1]")); // true
console.log(validateEmail("user.name+tag@sub.domain.co.uk")); // true
console.log(validateEmail("user@[999.999.999.1]")); // false (недопустимый IP)
console.log(validateEmail("invalid.email@")); // false
Реализация на PHP
function validateEmail($email) {
$regex = '/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]$/i';
return preg_match($regex, $email) === 1;
}
Реализация на Python
import re
def validate_email(email):
regex = r'^[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]$'
return bool(re.match(regex, email, re.IGNORECASE))
Ограничения и лучшие практики
Ограничения валидации с помощью регулярных выражений
- Невозможность проверки существования email: Регулярные выражения валидируют только формат, а не существование email
- Поддержка интернационализации: Этот шаблон фокусируется на ASCII; для Unicode-символов потребуется модификация
- Закавыченные локальные части: Хотя RFC поддерживает строковые литералы вроде
"john.doe"@example.com, этот шаблон их не обрабатывает - Сложные доменные литералы: Помимо базовых IP-адресов, существуют другие форматы доменных литералов
Лучшие практики для валидации email
- Используйте несколько методов валидации: Комбинируйте регулярные выражения с сервисами проверки email
- Пошаговая валидация: Начинайте с простого шаблона, затем используйте сложный для граничных случаев
- Пользовательский опыт: Разрешайте отправку формы даже при неудачной проверке регулярным выражением, но показывайте предупреждения
- Регулярные обновления: TLD и форматы email эволюционируют, поэтому периодически обновляйте шаблоны
Как отмечено на Hacker News, “лучше пропустить несколько недопустимых email, чем отклонить несколько допустимых” — это критически важно для пользовательского опыта.
Альтернативные подходы
Встроенная валидация HTML5
Для веб-форм HTML5 предоставляет нативную валидацию email:
<input type="email" pattern=".*@.*\..*" required>
Сервисная валидация
Рассмотрите использование сервисов валидации email, таких как:
Многошаговый подход
Для простоты реализации можно использовать:
// Простой шаблон для большинства случаев
const simplePattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
// Сложный шаблон для граничных случаев
const complexPattern = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:[0-9]{1,3}\.){3}[0-9]{1,3}\]$/i;
function validateEmail(email) {
return simplePattern.test(email) || complexPattern.test(email);
}
Источники
- Как можно проверить email-адрес с помощью регулярного выражения? - Stack Overflow
- Как найти или проверить email-адрес - Regular-Expressions.info
- Лучший шаблон регулярного выражения для валидации email-адреса - AbstractAPI
- 5 способов валидации email с помощью регулярных выражений - AbstractAPI
- Может ли “user@192.0.2.1” быть допустимым email-адресом? - Super User
- Перестаньте валидировать email-адреса с помощью сложных регулярных выражений - Hacker News
- Окончательное руководство по регулярным выражениям для валидации email - FormulasHQ
Заключение
Комплексный шаблон регулярного выражения /^[a-z0-9!#$%&'*+/=?^_~-]+(?:.[a-z0-9!#/i` обеспечивает надежную валидацию email, поддерживая как традиционные домены, так и литералы IP-адресов, при этом учитывая современные TLD любой длины. Для простоты реализации это единое сложное выражение устраняет необходимость в нескольких шаблонах, сохраняя соответствие RFC для большинства практических случаев использования. Помните, что валидация с помощью регулярных выражений должна комбинироваться с другими методами для комплексной проверки email, и всегда отдавайте приоритет пользовательскому опыту вместо строгой валидации, чтобы не отклонять допустимые email-адреса.