Регулярные выражения для проверки 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}$/;
Этот паттерн примет:
799912345678 (999) 123-45-677 999 123 45 678(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 поможет проверить корректность структуры.