Проверка пользовательских данных с помощью регулярных выражений

Регулярные выражения — универсальный инструмент для поиска, сопоставления и разборки текста. С их помощью можно быстро проверить, соответствует ли ввод пользователя ожидаемому формату. RegEx поддерживают многие языки и инструменты, включая Python и JavaScript.
Что проверять в первых шагах
- Нормализуйте ввод (уберите лишние пробелы с краёв).
- Решите, что считать допустимым (ASCII или Unicode).
- Делайте проверки как на клиенте, так и на сервере: клиент для UX, сервер для безопасности.
Важно: регулярные выражения проверяют формат, но не гарантируют безопасность (например, не заменяют сопутствующую проверку длины поля, ограничение частоты запросов или привязку к существующим учетным записям).
Валидация имени пользователя
Требования примера:
- Длина от 5 до 15 символов.
- Только буквы, цифры и подчёркивание (_).
- Первый символ — буква.
Шаблон, удовлетворяющий условиям:
^[A-Za-z]\w{4,14}$Разбор шаблона:
^[A-Za-z]— строка начинается с буквы латинского алфавита.\w{4,14}— затем 4–14 символов: буквы, цифры или подчёркивание.$— конец строки.
Пример на Python:
import re
def checkUsername(username):
regex = '^[A-Za-z]\\w{4,14}$'
r = re.compile(regex)
if re.search(r, username):
print('Valid')
else:
print('Not Valid')
username1 = 'yuvraj_chandra'
checkUsername(username1)
username2 = 'ja7&^%87'
checkUsername(username2)Вывод (скриншот):
Пример на JavaScript:
function checkUsername(user) {
if(/^[A-Za-z][A-Za-z0-9_]{4,14}$/.test(user)) {
console.log('Valid');
} else {
console.log('Not Valid');
}
}
checkUsername('yuvraj_chandra');
checkUsername('ja7&^%87');Советы и подводные камни:
- Если ваша аудитория использует нелатинские имена, продумайте поддержку Unicode (например,
\p{L}в движках, которые это поддерживают). - Решите заранее, нужны ли дефисы или точки в именах: при добавлении символов обновите шаблон.
Валидация адреса электронной почты
Важно: универсального RegEx для всех корректных email нет — стандарты (RFC) допускают сложные случаи. Здесь приведён рабочий компромисс для большинства случаев.
Условия примера:
- Локальная часть: буквы, цифры, подчёркивания, дефисы и точки.
- Один символ
@. - Имя домена: буквы, цифры, подчёркивания или дефисы.
- После домена обязателен точечный разделитель.
- Доменное расширение: буквы, цифры, подчёркивания или дефисы.
- Длина доменного расширения: 2–4 символа.
Шаблон:
^[\w.-]+@([\w-]+\.)+[\w-]{2,4}$Пример на Python:
import re
def checkEmailId(email):
regex = '^[\\w.-]+@([\\w-]+\\.)+[\\w-]{2,4}$'
r = re.compile(regex)
if re.search(r, email):
print('Valid')
else:
print('Not Valid')
email1 = 'abc@gmail.com'
checkEmailId(email1)
email2 = 'abc@def@gmail.kahscg'
checkEmailId(email2)Вывод (скриншот):
Пример на JavaScript:
function checkEmailId(email) {
if (/^[\\w.-]+@([\\w-]+\\.)+[\\w-]{2,4}$/.test(email)) {
console.log('Valid');
} else {
console.log('Not Valid');
}
}
checkEmailId('abc@gmail.com');
checkEmailId('abc@def@gmail.kahscg');Когда RegEx для email не подходит:
- Адреса с кавычками или комментариями по стандарту RFC не будут приняты этим шаблоном.
- Международные домены (IDN) и локальные части с юникод-символами потребуют расширенного синтаксиса.
Альтернатива: использовать валидацию на уровне сервера с почтовой проверкой (отправка подтверждающего письма) или специализированные библиотеки для валидации email.
Проверка сложности пароля
Правила примера:
- Минимум 8 символов.
- Есть хотя бы одна цифра.
- Есть хотя бы одна заглавная буква.
- Есть хотя бы одна строчная буква.
- Есть хотя бы один специальный символ.
Шаблон:
(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{8,})Пример на Python:
import re
def checkPasswordStrength(password):
regex = '(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{8,})'
r = re.compile(regex)
if re.search(r, password):
print('Strong Password')
else:
print('Weak Password')
password1 = 'Hiuahd$5jawd'
checkPasswordStrength(password1)
password2 = 'my_password'
checkPasswordStrength(password2)Вывод (скриншот):
Пример на JavaScript:
function checkPasswordStrength(password) {
if (/(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^A-Za-z0-9])(?=.{8,})/.test(password)) {
console.log('Strong Password');
} else {
console.log('Weak Password');
}
}
checkPasswordStrength('Hiuahd$5jawd');
checkPasswordStrength('my_password');Примечание по безопасности:
- RegEx помогают отбраковать слабые пароли по формату, но не заменяют проверок по словарю (чёрный список), проверок похожих паролей и многофакторной аутентификации.
Проверка формата даты (mm/dd/yyyy)
Шаблон, который проверяет формат даты (но не корректность календарной даты):
^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$Ограничения:
- Шаблон гарантирует вид «месяц/день/год», но не отбрасывает такие даты, как 02/31/2020.
- Для строгой проверки используйте разбор даты в языке (например, datetime в Python) после проверки формата.
Пример на Python:
import re
def checkDateFormat(date):
regex = '^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d$'
r = re.compile(regex)
if re.search(r, date):
print('Valid')
else:
print('Not Valid')
date1 = '03/21/2002'
checkDateFormat(date1)
date2 = '15/21/2002'
checkDateFormat(date2)Пример на JavaScript:
function checkDateFormat(date) {
if(/^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d$/.test(date)) {
console.log('Valid');
} else {
console.log('Not Valid');
}
}
checkDateFormat('03/21/2002');
checkDateFormat('15/21/2002');Проверка пустой строки
Шаблон для проверки пустой строки:
^$Примеры на Python и JavaScript:
import re
def checkEmptyString(s):
regex = '^$'
r = re.compile(regex)
if re.search(r, s):
print('The given string is empty')
else:
print('The given string is not empty')
checkEmptyString('')
checkEmptyString('This is not an empty string')function checkEmptyString(s) {
if (/^$/.test(s)) {
console.log('The given string is empty');
} else {
console.log('The given string is not empty');
}
}
checkEmptyString('');
checkEmptyString('This is not an empty string');Проверка ZIP-кода (США)
Шаблон для пятизначного и ZIP+4 формата:
^[0-9]{5}(?:-[0-9]{4})?$Пример на Python:
import re
def validateZIPCode(code):
regex = '^[0-9]{5}(?:-[0-9]{4})?$'
r = re.compile(regex)
if re.search(r, code):
print('Valid')
else:
print('Not Valid')
validateZIPCode('76309')
validateZIPCode('83468-2348')
validateZIPCode('234445')Пример на JavaScript:
function validateZIPCode(code) {
if (/^[0-9]{5}(?:-[0-9]{4})?$/.test(code)) {
console.log('Valid');
} else {
console.log('Not Valid');
}
}
validateZIPCode('76309');
validateZIPCode('83468-2348');
validateZIPCode('234445');Когда одной валидации RegEx недостаточно
- Формат присутствует, но значение некорректно (например, дата 02/30).
- RegEx не проверит уникальность (логины) или существование ресурса (email).
- Международные требования (IDN, Unicode) часто требуют расширенных шаблонов.
Рекомендация: комбинируйте RegEx с семантической валидацией и серверной логикой.
Практическая методология валидации (мини-SOP)
- Нормализация: trim(), NFC/NFD при необходимости для Unicode.
- Базовая RegEx-валидация формата для быстрого отклика.
- Семантическая проверка (парсинг даты, проверка домена, отправка подтверждения).
- Санитизация данных перед сохранением.
- Логирование и ограничения частоты запросов.
Важно: никогда не полагайтесь только на клиентскую валидацию.
Чеклист ролей
- Для разработчика:
- Добавьте и тестируйте RegEx в юнит-тестах.
- Документируйте ожидаемые форматы.
- Для QA:
- Тест-кейсы: граничные длины, недопустимые символы, локали.
- Для DevOps/Sec:
- Ограничьте скорость запросов на уровне API.
- Включите журналирование и мониторинг отказов валидации.
Тестовые случаи и критерии приёмки
Для каждого шаблона подготовьте набор тестов:
- Позитивные: корректные примеры формата.
- Негативные: недопустимые символы, превышение длины, пустые строки.
- Граничные: минимальная/максимальная длина.
Критерии приёмки:
- 100% позитивные тесты проходят.
- 0% негативных тестов проходят.
- Результаты проверены на целевой платформе (Python/JS).
Подсказки по производительности
- Компилируйте регулярные выражения один раз (re.compile в Python).
- Избегайте чрезмерно сложных шаблонов с backtracking (может замедлить или привести к DoS).
- Там, где нужно — используйте более простую валидацию и последующую семантическую проверку.
Маленький глоссарий (1 строка каждый)
- RegEx — язык шаблонов для поиска и сопоставления строк.
- Локальная часть — часть email до символа @.
- ZIP+4 — расширенный формат почтового индекса США (5-шт + 4).
Резюме
- RegEx удобны для быстрой проверки формата ввода.
- Используйте их как первый этап — затем семантическая валидация и серверная проверка.
- Тестируйте граничные случаи и документируйте допустимые символы.
Итог: правильно настроенные регулярные выражения повышают качество ввода и улучшают UX, но не заменяют полноценную серверную проверку и меры безопасности.
Похожие материалы
Windows 10: управление местоположением и приватность
Исправить Update failed в Google Chrome на Windows
Исправить ошибку 0x80073712 в Windows
Как изменить MAC-адрес в Windows
Как опубликовать видео с YouTube в Instagram