Уроки модуля (1/4)
Проверка электронной почты
«Правильная» проверка электронного письма — гораздо более сложная проблема, чем кажется: RFC 5322 — монстр. На практике мы выбираем достаточно хороший шаблон, который принимает общие случаи и отвергает явно неправильные.
Pattern: ^[\w.+-]+@[\w-]+(?:\.[\w-]+)+$[\w.+-]+-- локальная часть: буквы, цифры,_,.,+,-.@-- разделитель.[\w-]+(?:\.[\w-]+)+— домен + хотя бы один TLD, разделенный..
Что он принимает: mario.rossi@example.com, foo+bar@sub.example.co.uk,
user_123@test-domain.io.
Что он отклоняет: mario@, @example.com, mario@example (без TLD), пробелы.
Компромиссы
Приведенный выше шаблон не принимает:
— Строки в кавычках "strange (things)"@example.com (RFC допускает это).
- Домены с символами Юникода (
\u00fcber@m\u00fcnchen.de). – Очень длинные TLD, не соответствующие\w(например, интернационализированные).
Если они вам нужны, расширите класс до \p{L} с помощью флага u или делегируйте его
специализированная библиотека.
Компромиссы и лучшие практики проверки электронной почты
Никакое регулярное выражение не может гарантировать, что адрес электронной почты действительно существует. Чрезмерно сложные шаблоны снижают производительность и исключают необычные, но действительные домены. Лучше использовать простой шаблон проверки, чтобы отклонить очевидные опечатки и отправить код проверки.
Попробуйте это
Распознавайте каждое письмо в тексте. Используйте простой шаблон: буквы/цифры/точки перед @, домен хотя бы с одной точкой.
Показать подсказку
Расширьте локальную часть до [\\w.+-]+ и домен до [\\w-]+\\.[\\w.-]+, чтобы принять несколько TLD.
Решение доступно после 3 попыток
Обзор упражнения
Захватывайте домен (часть после @) каждого электронного письма как именованную группу dominio.
Показать подсказку
Оберните доменную часть в именованную группу: (?<dominio>[\\w.-]+).
Решение доступно после 3 попыток
Дополнительная задача
Find the domain part of an email (everything after `@`), excluding the `@` sign using lookbehind.
Показать подсказку
Используйте положительный просмотр назад (?<=@) перед классом символов домена.
Решение доступно после 3 попыток