ttools
валидацияформырегулярные выражения

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

Готовые regex-паттерны для валидации email, телефонов и почтовых индексов без сложного программирования.

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

Почему стандартные regex для email не работают

Большинство разработчиков начинают с чего-то вроде ^[\w.-]+@[\w.-]+\.\w+$. Выглядит логично, но такой паттерн пропустит user@domain без точки в домене или споткнётся на валидных адресах вроде name+tag@example.co.uk.

Основные проблемы простых регулярок:

  • Не учитывают многоуровневые домены (.co.uk, .com.au)
  • Блокируют символ + в локальной части (а его часто используют для фильтрации)
  • Пропускают адреса без точки после @
  • Не проверяют длину доменной зоны

Вот рабочий вариант для 95% случаев:

const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;

Этот паттерн:

  • Разрешает точки, дефисы, + и % в имени пользователя
  • Требует хотя бы одну точку в домене
  • Проверяет, что доменная зона состоит минимум из двух букв

Для строгой валидации можно добавить проверку длины:

function validateEmail(email) {
  const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return regex.test(email) && email.length <= 254;
}

Лимит в 254 символа взят из RFC 5321 — это максимальная длина email-адреса.

Телефонные номера: универсального regex не существует

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

Российские номера

Для России проще всего принимать номер из 11 цифр, начинающийся с 7 или 8:

const phoneRU = /^[78]\d{10}$/;

Если нужно разрешить форматирование:

const phoneRUFormatted = /^[78][\s(]?\d{3}[\s)]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$/;

Этот паттерн примет:

  • 79991234567
  • 8 (999) 123-45-67
  • 7 999 123 45 67
  • 8(999)1234567

Для очистки перед отправкой на сервер:

function normalizePhone(phone) {
  return phone.replace(/\D/g, '');
}

Международный формат

Если работаете с номерами разных стран, безопаснее использовать библиотеку вроде libphonenumber-js. Но для простой проверки подойдёт:

const phoneInternational = /^\+?[1-9]\d{6,14}$/;

Этот regex проверяет:

  • Опциональный + в начале
  • Первая цифра от 1 до 9
  • От 7 до 15 цифр в сумме (стандарт E.164)

Почтовые индексы по странам

Индексы сильно различаются по формату. Вот паттерны для популярных стран:

Россия

Шесть цифр, часто пишут с пробелом после третьей:

const postcodeRU = /^\d{6}$/;

Если разрешаете пробел:

const postcodeRUWithSpace = /^\d{3}\s?\d{3}$/;

США

Пять цифр или формат ZIP+4:

const postcodeUS = /^\d{5}(-\d{4})?$/;

Великобритания

Сложный формат с буквами и цифрами:

const postcodeUK = /^[A-Z]{1,2}\d{1,2}\s?\d[A-Z]{2}$/i;

Примеры: SW1A 1AA, EC1A1BB, W1A 0AX.

Канада

Чередование букв и цифр:

const postcodeCA = /^[A-Z]\d[A-Z]\s?\d[A-Z]\d$/i;

Пример: K1A 0B1.

Частые ошибки при использовании regex

Забыли экранировать точку

Точка в regex означает «любой символ». Если проверяете email, пишите \. вместо .:

// Неправильно — пропустит user@domain@com
/^[\w]+@[\w]+.[\w]+$/

// Правильно
/^[\w]+@[\w]+\.[\w]+$/

Не учли многострочный ввод

Пользователь может случайно вставить перенос строки. Добавляйте флаг m или обрезайте пробелы:

function validateEmailSafe(email) {
  const trimmed = email.trim();
  return /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(trimmed);
}

Не дали фидбек пользователю

Regex вернёт только true или false. Для UX лучше уточнить, что именно не так:

function validateEmailWithFeedback(email) {
  if (!email.includes('@')) {
    return { valid: false, error: 'Добавьте символ @' };
  }
  if (!/\.[a-zA-Z]{2,}$/.test(email)) {
    return { valid: false, error: 'Укажите доменную зону (.ru, .com)' };
  }
  const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return regex.test(email) 
    ? { valid: true } 
    : { valid: false, error: 'Проверьте формат адреса' };
}

Когда regex недостаточно

Регулярные выражения проверяют только формат, но не существование. Email может быть синтаксически верным, но несуществующим. Телефон — корректным по структуре, но отключенным.

Для надёжной валидации добавляйте:

  • Проверку MX-записей для email (на бэкенде)
  • Отправку кода подтверждения на телефон
  • Базу валидных почтовых индексов

На клиенте regex остаётся первой линией защиты от опечаток и явно неверного ввода.

Тестирование и отладка паттернов

Перед использованием в продакшене проверяйте regex на реальных данных. Если нужно быстро протестировать паттерн или разобраться в чужом регулярном выражении, используйте Regex Tester — он подсветит совпадения и покажет группы захвата. Для работы с текстом, который нужно обработать перед валидацией, пригодится Text Utils с функциями обрезки пробелов и нормализации. А если собираете данные из форм в JSON для отправки на API, JSON Formatter поможет проверить корректность структуры.

Инструменты по теме