Разработка

Регулярные выражения для проверки email, URL и номера телефона

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

Средний · Чтение: 8 мин · Обновлено 30 октября 2026 г.

Регулярные выражения для проверки email, URL и номера телефона

Проверяйте мягко, подтверждайте по-настоящему

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

Адреса электронной почты

Практичный шаблон, который подходит почти для всех реальных адресов:

^[^\s@]+@[^\s@]+\.[^\s@]{2,}$

Что-то, затем @, домен с точкой и без пробелов. Он принимает ada+news@example.co.uk и отклоняет ada@example и ada @example.com. Чуть более строгий вариант для локальной части:

^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$

Этот вариант отклоняет интернационализированные адреса (например, josé@example.com), поэтому если ваши пользователи по всему миру, выбирайте первый. В HTML <input type="email"> уже проверяет адрес встроенным правилом браузера. Чтобы убедиться, что домен может принимать почту, проверьте его MX-запись с помощью Email DNS Checker.

URL

Не пишите регулярное выражение для URL — разбирайте его парсером. В каждой современной среде выполнения есть парсер URL, который знает все правила:

function isHttpUrl(value) {
  try {
    const u = new URL(value);
    return u.protocol === 'http:' || u.protocol === 'https:';
  } catch {
    return false;
  }
}

Проверка протокола важна: new URL('javascript:alert(1)') разбирается без ошибок, но такая строка никогда не должна попадать в href. Если нужно регулярное выражение, чтобы найти URL в тексте, используйте простое и разбирайте каждое совпадение потом:

https?:\/\/[^\s<>"']+

Разбить URL на протокол, хост, путь и параметры запроса поможет URL Parser.

Телефонные номера

Форматы телефонов различаются по странам, поэтому самое надёжное регулярное выражение только очищает ввод. Удалите всё, кроме цифр и ведущего плюса, затем проверьте длину по стандарту E.164 (до 15 цифр):

const clean = input.replace(/(?!^\+)[^\d]/g, '');
const ok = /^\+?[1-9]\d{6,14}$/.test(clean);

Для настоящей проверки по странам — коды регионов, мобильные и стационарные номера — используйте библиотеку, например libphonenumber. Если вы принимаете только номера Северной Америки, подойдёт такой шаблон:

^\(?([2-9]\d{2})\)?[-.\s]?(\d{3})[-.\s]?(\d{4})$

Проверьте перед запуском

Вставьте шаблон в Regex Tester вместе со списком корректных и некорректных примеров, по одному в строке, и включите флаг multiline, чтобы ^ и $ совпадали с каждой строкой. Если унаследованный шаблон нечитаем, Regex Explainer разберёт его по токенам. Остерегайтесь катастрофического бэктрекинга: вложенные квантификаторы вроде (a+)+ могут заблокировать сервер на специально подобранной строке.

Часто задаваемые вопросы

Какое регулярное выражение лучше всего подходит для проверки email?
Простое: ^[^\s@]+@[^\s@]+\.[^\s@]{2,}$. Сложные шаблоны в стиле RFC отклоняют корректные адреса и всё равно не могут подтвердить, что почтовый ящик существует. Для этого отправьте письмо с подтверждением.
Стоит ли проверять URL с помощью регулярного выражения?
Нет. Используйте парсер URL, встроенный в ваш язык (new URL() в JavaScript, urllib.parse в Python), и проверьте, что протокол — http или https.
Почему моё регулярное выражение работает для одной строки, но не для списка?
Без флага m (multiline) ^ и $ соответствуют началу и концу всего текста, а не каждой строке.

Читайте также