Готовые шаблоны
Email-валидация — первое что нужно при работе с формами регистрации. Идеального регекса не существует (RFC 5322 — 6300 символов и всё равно не покрывает всё), но есть три уровня практичных шаблонов.
Уровень 1 — простейший (для прототипа)
.+@.+\..+
«Что-то, @, что-то, точка, что-то». Покрывает 95% реальных email. Не валидирует строго, но ловит опечатки типа отсутствующего @ или точки. Идеально для первого MVP.
Уровень 2 — продвинутый (рекомендуем)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$Покрывает 99% реальных email:
[a-zA-Z0-9._%+-]+— локальная часть: буквы, цифры, точка, нижнее подчёркивание, процент, плюс, дефис.@— обязательный.[a-zA-Z0-9.-]+— домен: буквы, цифры, точки, дефисы.\\.[a-zA-Z]{2,}— TLD: точка + минимум 2 буквы.
Уровень 3 — RFC 5322 (если очень нужно)
Полная regex для RFC 5322 занимает 6300 символов. Поддерживает странные кейсы вроде "user.name+tag"@example.com или user@[192.168.1.1]. Если вам ДЕЙСТВИТЕЛЬНО нужно — используйте email-validator (Python), validator.js (JavaScript), Apache Commons Validator (Java).
A valid email address is a string that matches the email production of the following ABNF... В отличие от RFC 5322, HTML5 спецификация определяет более простую и практичную регулярку: ^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$— HTML5 Specification, W3CПростой regex — детально
Разберём по частям шаблон ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$:
^— начало строки. Без этого matches могут быть в середине текста.[a-zA-Z0-9._%+-]+— один или больше из перечисленных символов. Это local part (до @).@— литерал «собака».[a-zA-Z0-9.-]+— domain name (до точки TLD).\\.— экранированная точка (без \\ это «любой символ»).[a-zA-Z]{2,}— TLD: 2 или больше букв.$— конец строки. Защита от добавления символов после.
Примеры валидных email
- simple@example.com
- very.common@example.com
- disposable.style.email.with+symbol@example.com
- other.email-with-hyphen@example.com
- fully-qualified-domain@example.com
- user.name+tag+sorting@example.com
- x@example.com
- example-indeed@strange-example.com
- example@s.example
Примеры невалидных
- plainaddress (без @)
- #@%^%#$@#$@#.com (странные символы)
- @example.com (нет local part)
- email@example (нет TLD)
- email@example.com (всё ОК)
- email@-example.com (домен начинается с -)
- email@example..com (двойная точка)
Подводные камни
- Не валидирует существование. Regex проверяет только формат. user@example.com может быть валидным форматом, но домен example.com может не существовать. Реальная валидация — отправить письмо.
- Performance. Использование
.*и.+в неправильных местах даёт catastrophic backtracking — regex может работать секунды на длинных строках. Используйте[^@]+вместо.*. - Кириллические email. RFC 6530 разрешает иван@почта.рф, но 60% SMTP-серверов не поддерживают. На практике конвертируйте в Punycode перед отправкой.
- Plus-addresses. Gmail-стандарт: user+tag@gmail.com доставляется на user@gmail.com. Многие сайты ОТКЛОНЯЮТ + как невалидный — это баг, не фича.
- Локальная часть с точкой. first.last@example.com — валидно. first..last (двойная точка) — невалидно.
- Длина. RFC 5321 максимум: local part 64 символа, domain 255 символов, общий 254 символа. Большинство regex не учитывают.
- Comments. RFC 5322 разрешает (комментарий)user@example.com. Никто не использует. Игнорируйте.
- RFC 5322 — Internet Message Format. IETF. datatracker.ietf.org/doc/html/rfc5322. 2008.
- HTML5 — Email type spec. WHATWG. html.spec.whatwg.org/multipage/input.html#valid-e-mail-address. 2024.
- I Knew How To Validate An Email Address Until I Read The RFC. David Celis. davidcel.is. 2014.
