Введение
Регулярные выражения, часто называемые "regex" или "regexp", являются одним из самых мощных инструментов в арсенале разработчика. Они позволяют искать, сопоставлять и манипулировать текстом с невероятной точностью. Тем не менее, многие разработчики находят regex пугающим, с его загадочным синтаксисом и кажущимися магическими возможностями.
Это руководство демистифицирует регулярные выражения, сосредоточившись на практических, реальных паттернах, которые вы действительно будете использовать. К концу вы поймете не только как работает regex, но и когда и почему его использовать.
Что Такое Регулярные Выражения?
Регулярное выражение - это последовательность символов, которая определяет шаблон поиска. Думайте о нем как о супер-мощной функции "Найти", которая может сопоставлять сложные текстовые паттерны, а не только точные строки.
Почему Использовать Regex?
- Сопоставление Паттернов: Находить текст, следующий определенному паттерну
- Валидация: Проверять форматы данных (email, телефоны и т.д.)
- Обработка Текста: Извлекать, заменять или трансформировать текст
- Поиск и Замена: Находить и изменять текст массово
- Извлечение Данных: Извлекать специфическую информацию из неструктурированного текста
Базовые Концепции
Перед погружением в паттерны поймите эти основные концепции:
- Литеральные Символы: Сопоставлять точный текст
- Метасимволы: Специальные символы со значением (., *, +, ?, и т.д.)
- Классы Символов: Сопоставлять наборы символов ([a-z], \d, и т.д.)
- Квантификаторы: Указывать сколько раз сопоставлять (*, +, ?, {n})
- Якоря: Сопоставлять позиции (^, $, \b)
- Группы: Захватывать и организовывать совпадения ((...))
Основные Regex-Паттерны
1. Валидация Email
Один из самых распространенных случаев использования regex:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Разбор:
^- Начало строки[a-zA-Z0-9._%+-]+- Один или более буквенно-цифровых символов, точки, подчеркивания и т.д.@- Литеральный символ @[a-zA-Z0-9.-]+- Часть домена\.- Литеральная точка (экранированная)[a-zA-Z]{2,}- Домен верхнего уровня (2+ буквы)$- Конец строки
Использование:
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
if (emailRegex.test(userEmail)) {
console.log("Валидный email");
}
2. Сопоставление Номеров Телефонов
Сопоставить различные форматы телефонных номеров:
^(\+?1[-.\s]?)?\(?([0-9]{3})\)?[-.\s]?([0-9]{3})[-.\s]?([0-9]{4})$
Сопоставляет:
- (123) 456-7890
- 123-456-7890
- 123.456.7890
- +1 123 456 7890
- 1234567890
3. Валидация URL
Сопоставить веб-URL:
^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$
Разбор:
^https?://- Протокол (http или https)(www\.)?- Опциональный www[-a-zA-Z0-9@:%._\+~#=]{1,256}- Доменное имя\.[a-zA-Z0-9()]{1,6}- Домен верхнего уровня\b- Граница слова([-a-zA-Z0-9()@:%_\+.~#?&//=]*)- Опциональный путь
4. Надежность Пароля
Проверка надежных паролей:
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$
Требования:
- Как минимум одна строчная буква
- Как минимум одна заглавная буква
- Как минимум одна цифра
- Как минимум один специальный символ
- Минимум 8 символов
5. Номера Кредитных Карт
Сопоставить распространенные форматы кредитных карт:
^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13}|3[0-9]{13}|6(?:011|5[0-9]{2})[0-9]{12})$
Сопоставляет:
- Visa: 4xxxxxxxxxxxxx
- MasterCard: 5xxxxxxxxxxxxxx
- American Express: 34xxxxxxxxxxxxx или 37xxxxxxxxxxxxx
- Discover: 6011xxxxxxxxxxxx
Распространенные Классы Символов
Предопределенные Классы
\d # Любая цифра [0-9]
\w # Символ слова [a-zA-Z0-9_]
\s # Пробел [ \t\n\r\f\v]
\D # Не-цифра [^0-9]
\W # Не-символ слова [^a-zA-Z0-9_]
\S # Не-пробел [^ \t\n\r\f\v]
Пользовательские Классы Символов
[aeiou] # Сопоставить любую гласную
[^aeiou] # Сопоставить все кроме гласных
[a-z] # Сопоставить строчные буквы
[A-Z] # Сопоставить заглавные буквы
[0-9] # Сопоставить цифры
[a-zA-Z0-9] # Сопоставить буквенно-цифровые
[0-9a-fA-F] # Сопоставить шестнадцатеричные
Квантификаторы
Контролировать сколько раз паттерн сопоставляется:
* # Ноль или более (жадный)
+ # Один или более (жадный)
? # Ноль или один (опциональный)
{n} # Ровно n раз
{n,} # n или более раз
{n,m} # Между n и m раз
*? # Ноль или более (ленивый)
+? # Один или более (ленивый)
Примеры
a* # Сопоставляет "", "a", "aa", "aaa", ...
a+ # Сопоставляет "a", "aa", "aaa", ... (не "")
a? # Сопоставляет "", "a"
a{3} # Сопоставляет ровно "aaa"
a{3,} # Сопоставляет "aaa", "aaaa", "aaaaa", ...
a{3,5} # Сопоставляет "aaa", "aaaa", "aaaaa"
Якоря и Границы
Якоря Позиций
^ # Начало строки (или линии в многострочном режиме)
$ # Конец строки (или линии в многострочном режиме)
\b # Граница слова
\B # Не-граница слова
\A # Начало строки (всегда)
\Z # Конец строки (всегда)
Примеры
^Hello # "Hello" в начале
World$ # "World" в конце
\bword\b # Целое слово "word" (не "sword" или "words")
Группы и Захват
Захватывающие Группы
(abc) # Захватывающая группа
(?:abc) # Не-захватывающая группа
(?<name>abc) # Именованная захватывающая группа
Примеры
const regex = /(\d{3})-(\d{3})-(\d{4})/;
const match = "123-456-7890".match(regex);
// match[0] = "123-456-7890" (полное совпадение)
// match[1] = "123" (первая группа)
// match[2] = "456" (вторая группа)
// match[3] = "7890" (третья группа)
Lookaheads и Lookbehinds
Положительный Lookahead
(?=pattern) # Должен следовать за паттерном
Пример: Сопоставить "cat" только если следует "s":
cat(?=s) # Сопоставляет "cat" в "cats" но не "cat" в "catch"
Отрицательный Lookahead
(?!pattern) # НЕ должен следовать за паттерном
Пример: Сопоставить "cat" только если НЕ следует "s":
cat(?!s) # Сопоставляет "cat" в "catch" но не "cat" в "cats"
Lookbehinds
(?<=pattern) # Должен предшествовать паттерну
(?<!pattern) # НЕ должен предшествовать паттерну
Реальные Случаи Использования
1. Валидация Форм
// Валидация email
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(email)) {
return "Недействительный формат email";
}
// Валидация телефона
const phoneRegex = /^\+?[\d\s\-()]+$/;
if (!phoneRegex.test(phone)) {
return "Недействительный номер телефона";
}
2. Извлечение Текста
// Извлечь все email-адреса из текста
const text = "Свяжитесь с нами [email protected] или [email protected]";
const emailRegex = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/g;
const emails = text.match(emailRegex);
// ["[email protected]", "[email protected]"]
3. Замена Текста
// Скрыть номера кредитных карт
const cardNumber = "1234-5678-9012-3456";
const masked = cardNumber.replace(/\d{4}(?=\d)/g, "****-");
// "****-****-****-3456"
4. Очистка Данных
// Удалить лишние пробелы
const text = "Привет мир от regex";
const cleaned = text.replace(/\s+/g, " ");
// "Привет мир от regex"
// Удалить специальные символы
const dirty = "Привет@Мир#123!";
const clean = dirty.replace(/[^a-zA-Zа-яА-Я0-9\s]/g, "");
// "ПриветМир123"
5. Парсинг URL
const urlRegex = /^https?:\/\/([^\/]+)(\/.*)?$/;
const url = "https://example.com/path/to/page";
const match = url.match(urlRegex);
// match[1] = "example.com"
// match[2] = "/path/to/page"
Распространенные Ошибки
Ошибка 1: Слишком Сложные Паттерны
# ПЛОХО: Слишком сложно
^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$
# ХОРОШО: Проще и поддерживаемее
^[^\s@]+@[^\s@]+\.[^\s@]+$
Ошибка 2: Не Экранировать Специальные Символы
# ПЛОХО: Точка сопоставляет любой символ
/example.com/
# ХОРОШО: Экранированная точка сопоставляет литеральную точку
/example\.com/
Ошибка 3: Жадное vs Ленивое Сопоставление
# Жадное: Сопоставляет как можно больше
/<.*>/ # Сопоставляет весь "<div><p>text</p></div>"
# Ленивое: Сопоставляет как можно меньше
/<.*?>/ # Сопоставляет отдельные теги "<div>", "<p>", и т.д.
Советы по Производительности
- Компилировать Один Раз: При повторном использовании одного regex, компилируйте его один раз
- Использовать Якоря:
^и$делают сопоставление быстрее - Избегать Катастрофического Backtracking: Будьте осторожны с вложенными квантификаторами
- Использовать Специфичные Паттерны: Более специфичные паттерны быстрее
- Рассмотреть Альтернативы: Иногда строковые методы быстрее, чем regex
Тестирование Вашего Regex
Онлайн-Инструменты
- Regex101: Тестировать и отлаживать regex-паттерны
- Regexr: Интерактивное тестирование regex
- RegEx Pal: Простой тестер regex
Лучшие Практики
- Тестировать с различными входными данными
- Тестировать граничные случаи (пустые строки, специальные символы)
- Тестировать с недействительными входными данными
- Документировать ваши паттерны
- Использовать комментарии в сложном regex
Заключение
Регулярные выражения - это мощный инструмент, который при освоении может значительно улучшить ваши способности обработки текста. Начните с простых паттернов, практикуйтесь регулярно и постепенно переходите к более сложным выражениям.
Помните: Regex - это инструмент, а не решение каждой проблемы. Иногда простые строковые методы более подходящи. Но когда вам нужно сопоставление паттернов, валидация или извлечение текста, regex часто лучший выбор.
Ключ к освоению regex - это практика. Начните с распространенных паттернов в этом руководстве, поймите как они работают, затем адаптируйте их к вашим конкретным потребностям.
Использование Наших Regex-Инструментов
В 1tool.dev мы предлагаем мощный Тестер Regex, который помогает тестировать, отлаживать и понимать регулярные выражения. Наш инструмент обеспечивает сопоставление в реальном времени, подробные объяснения и поддерживает множество вариантов regex.
Попробуйте наш тестер regex сегодня и станьте экспертом по regex!




