Шпаргалка по регулярным выражениям
Регулярные выражения — это мощный инструмент для поиска, фильтрации и преобразования текста, который широко применяется в программировании, тестировании и автоматизации. Понимание основ regex (regular expressions) критично для специалистов, работающих с большими объемами данных, логами, вводом пользователей или автоматизацией рутинных операций. В этой шпаргалке собраны основные конструкции регулярных выражений, рекомендации по их применению, а также практические примеры из разработки и проверки ПО. Материал ориентирован на использование в России, Беларуси и Китае, где поддержка локальных алфавитов и специфических форматов данных особенно актуальна.
Базовые конструкции регулярных выражений
Регулярные выражения строятся из множества элементарных символов и управляющих конструкций. Вот ключевые элементы:
- Символы и литералы — соответствуют самим себе: a найдёт букву «а», 7 — цифру «7».
- Точка (.) — любой одиночный символ, кроме перевода строки: c.t найдёт «cat», «cot», «c_t».
- Квантификаторы — задают количество вхождений:
- * — 0 или более раз: ab* найдёт «a», «ab», «abb», «abbb».
- + — 1 или более раз: ab+ найдёт «ab», «abb», но не «a».
- ? — 0 или 1 раз: ab? найдёт «a» и «ab».
- {n} — ровно n раз: a{3} найдёт «aaa».
- {n,} — n и более раз: a{2,} найдёт «aa», «aaa», и т.д.
- {n,m} — от n до m раз: a{2,4} найдёт «aa», «aaa», «aaaa».
- Экранирование (\) — делает специальный символ обычным: \. найдёт точку, а не любой символ.
Группировка и альтернативы
- Круглые скобки ( ) — группировка символов: (ab){2} найдёт «abab».
- Квадратные скобки [ ] — любой символ из диапазона: [abc] — «a», «b» или «c».
- Диапазоны внутри [ ]: [0-9] — любая цифра, [а-яё] — любая русская буква.
- Отрицание внутри [ ]: [^0-9] — любой символ, кроме цифры.
- Вертикальная черта (|) — альтернатива: cat|dog найдёт «cat» или «dog».
Якоря и специальные символы
- ^ — начало строки: ^abc найдёт «abc» только в начале строки.
- $ — конец строки: abc$ найдёт «abc» только в конце строки.
- \b — граница слова: \bword\b найдёт только отдельное слово «word».
- \d — цифра (аналог [0-9]).
- \w — буква, цифра или подчёркивание (аналог [A-Za-z0-9_]).
- \s — любой пробельный символ.
- \D, \W, \S — отрицания предыдущих.
Пример: Регулярное выражение ^\d{4}-\d{2}-\d{2}$ валидирует дату в формате «ГГГГ-ММ-ДД» (например, 2023-06-15).
Практические примеры для России, Беларуси и Китая
Телефонные номера
В России и Беларуси телефонные номера часто записываются в формате +7 (XXX) XXX-XX-XX или +375 (XX) XXX-XX-XX. В Китае номера имеют вид +86 1XXXXXXXXXX.
| Страна | Пример номера | Пример regex | Особенности |
|---|---|---|---|
| Россия | +7 (912) 345-67-89 | \+7\s?\(\d{3}\)\s?\d{3}-\d{2}-\d{2} | Скобки и дефисы обязательны |
| Беларусь | +375 (29) 123-45-67 | \+375\s?\(\d{2}\)\s?\d{3}-\d{2}-\d{2} | Двузначный код оператора |
| Китай | +86 13812345678 | \+86\s?1\d{10} | Мобильные номера начинаются с 1 |
Контрпример
Регулярное выражение \d{11} найдёт 11 подряд идущих цифр, но не гарантирует формат и страну. Это риск при валидации пользовательских данных — возможна некорректная обработка.
Проверка электронных адресов
Валидация email — сложная задача, но для рабочих кейсов используют сокращённые паттерны:
- ^[\w\.\-]+@[\w\-]+\.[a-zа-я]{2,}$ — допускает латиницу, кириллицу (например, в домене .рф), точки и дефисы в имени пользователя.
Реальный кейс: В одном проекте для локального банка в Беларуси email-адреса клиентов содержали домены .by, .com, .рф. Валидация через слишком строгий паттерн (только латиница) привела к массовым ошибкам при регистрации. После обновления regex с учётом кириллицы количество баг-репортов снизилось на 85%.
Работа с кириллицей и китайскими иероглифами
Для поддержки национальных алфавитов используют:
- [а-яёА-ЯЁ] для русских букв (флаг i для регистра).
- [\u4e00-\u9fff] для китайских иероглифов (базовый диапазон Unicode).
Пример для валидации ФИО на русском:
- ^[А-ЯЁ][а-яё]+\s[А-ЯЁ][а-яё]+\s[А-ЯЁ][а-яё]+$ — три слова с заглавной буквы, разделённые пробелом.
Частые сценарии применения регулярных выражений
Поиск и замена в IDE и системах контроля версий
Регулярные выражения позволяют быстро находить и править код во множестве файлов. Например:
- Для поиска всех TODO-комментариев: //\s?TODO:.*
- Для массового переименования переменных: \boldVar\b на newVar
Автоматизация тестирования
В тестовых сценариях регулярные выражения используются для:
- Проверки формата вывода (логов, сообщений ошибок).
- Валидации данных на UI и API-уровне.
Метрика: В проектах с покрытием автотестами выше 70% (code coverage) регулярные выражения позволяют снизить количество ложноположительных срабатываний на 30–40% за счёт более точных проверок паттернов.
Парсинг логов и данных
В задачах анализа логов (например, в банковских или телеком-проектах) regex позволяет выделять нужные записи для мониторинга или аудита:
- Парсинг времени: \d{2}:\d{2}:\d{2}
- Извлечение IP-адреса: (\d{1,3}\.){3}\d{1,3}
В одном из кейсов интеграции с китайским облачным сервисом понадобилось выделять только сообщения с кодами ошибок вида ERR-[A-Z]{3,5}-\d{4}. Такой подход ускорил обработку логов и сократил время анализа инцидентов (incident response time) на 25%.
Ошибки и ограничения при работе с регулярными выражениями
Типовые ошибки
- Слишком общий паттерн — приводит к ложным совпадениям, усложняет поддержку.
- Отсутствие экранирования — ошибки при поиске по спецсимволам (например, точка, скобки).
- Игнорирование локализации — проблемы с кириллицей, иероглифами, разными разделителями дат и чисел.
Контрпример: выражение .*@.*\..* считает валидным адрес @.., что некорректно для почты.
Риски и trade-offs
- Перегрузка вычислений: сложные regex могут значительно замедлять обработку больших файлов. В системах с высоким трафиком (например, онлайн-банкинг) это критичный фактор.
- Читаемость и поддержка: сложные шаблоны затрудняют ревью и усложняют онбординг новых разработчиков.
- Ограничения движка: не все языки и фреймворки поддерживают расширенные конструкции regex, например, обратные ссылки или lookbehind (JavaScript поддерживает только с ES2018).
Фреймворки, инструменты и best practices
Инструменты для проверки регулярных выражений
- Встроенные валидаторы в IDE (например, в JetBrains, VS Code).
- Онлайн-сервисы (для внутреннего использования) — позволяют тестировать паттерны на реальных данных перед внедрением в проект.
- В некоторых ATS и LXP-системах предусмотрена поддержка шаблонов для валидации ввода при найме или обучении.
Best practices
- Пишите регулярные выражения с учётом локализации и специфики данных (например, учитывайте кириллицу, иероглифы, разделители дат).
- Документируйте назначение каждого паттерна прямо в коде или в документации теста.
- Покрывайте автотестами кейсы с валидными и невалидными примерами. KPI: bug rate по валидации не должен превышать 2% от общего числа тикетов.
- Используйте группировку и именованные группы для повышения читаемости (например, (?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})).
- Не применяйте регулярные выражения там, где проще использовать стандартные функции языка (например, split, startswith).
Шпаргалка: основные конструкции и примеры
| Конструкция | Описание | Пример | Что найдёт |
|---|---|---|---|
| . | Один любой символ | c.t | cat, cot, c_t |
| \d | Цифра | \d{3} | 123, 456 |
| \w | Буква, цифра или _ | \w+ | word, test123 |
| [а-яё] | Одна русская буква | [а-яё]{2,} | тест, слово |
| ^, $ | Начало/конец строки | ^abc$, ^\d+ | abc (целиком), числа в начале строки |
| (…) | Группа | (ab)+ | ab, abab, ababab |
| [ ] | Любой из символов | [abc] | a, b, c |
| [^ ] | Любой, кроме | [^0-9] | любая нецифра |
| ? | 0 или 1 раз | ab? | a, ab |
| * | 0 или более раз | ab* | a, ab, abb… |
| + | 1 или более раз | ab+ | ab, abb… |
| {n,m} | от n до m раз | a{2,4} | aa, aaa, aaaa |
| | | ИЛИ | cat|dog | cat, dog |
| \b | Граница слова | \btest\b | test (отдельно) |
Рекомендации для внедрения и обучения
- Интегрируйте работу с регулярными выражениями в курсы по разработке, тестированию и анализу данных — практика с реальными логами, вводом


