Регулярное выражение (regex) — это компактный способ описать паттерн текста: не конкретную строку, а правило, которому строка должна соответствовать. Вместо перебора символов в цикле можно одним выражением проверить или найти сложную структуру.
Базовые строительные блоки
- Классы символов —
\d(цифра),\w(буква/цифра/подчёркивание),\s(пробельный символ), или собственный класс[a-zA-Z]. - Квантификаторы —
*(0 или больше),+(1 или больше),?(0 или 1),{2,5}(от 2 до 5 раз). - Группы захвата — круглые скобки
(...)выделяют часть совпадения, которую потом можно использовать отдельно, например при замене. - Якоря —
^и$привязывают паттерн к началу или концу строки.
Почему \w не видит кириллицу
В движке регулярных выражений JavaScript, на котором работает этот инструмент, класс \w всегда означает только [A-Za-z0-9_] — то есть латиницу, цифры и подчёркивание. Проверка /^\w+$/.test('привет') вернёт false, и флаг u здесь не поможет: в отличие от Python, где \w по умолчанию понимает Unicode, в JS-регулярках \w остаётся жёстко привязан к ASCII независимо от флагов. Чтобы поймать кириллицу, нужно явно указать /^\p{L}+$/u — класс «любая буква» из Unicode-свойств, доступный только вместе с флагом u.
Жадный против ленивого поиска
По умолчанию квантификаторы «жадные» — они пытаются захватить как можно больше символов, а потом отступают, если это мешает найти совпадение. Например, <.+> на строке <a>text</a> захватит всё от первого < до последнего >. Добавление ? после квантификатора (<.+?>) делает его «ленивым» — он захватывает как можно меньше, останавливаясь на первом возможном совпадении.
Зачем это нужно
- Валидация формата входных данных (email, номер телефона, почтовый индекс).
- Поиск и массовая замена текста по паттерну, а не точному совпадению.
- Извлечение структурированных данных из логов или неструктурированного текста.
Катастрофический backtracking
Вложенные квантификаторы вроде (a+)+ могут на определённых входных строках заставить движок regex перебирать экспоненциальное количество комбинаций, прежде чем признать, что совпадения нет, — страница или сервер «зависают» на, казалось бы, простом выражении. Это реальная уязвимость (ReDoS), поэтому сложные вложенные квантификаторы стоит тестировать на длинных «почти совпадающих» строках, а не только на ожидаемых примерах.