Все статьи

Регулярные выражения: основной синтаксис и типичные паттерны

Регулярное выражение (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), поэтому сложные вложенные квантификаторы стоит тестировать на длинных «почти совпадающих» строках, а не только на ожидаемых примерах.

Попробовать инструмент