Усі статті

Регулярні вирази: основний синтаксис і типові патерни

Регулярний вираз (regex) — це компактний спосіб описати патерн тексту: не конкретний рядок, а правило, якому рядок повинен відповідати. Замість перебору символів у циклі можна одним виразом перевірити чи знайти складну структуру.

Базові будівельні блоки

  • Класи символів\d (цифра), \w (буква/цифра/підкреслення), \s (пробільний символ), або власний клас [a-zA-Z].
  • Квантифікатори* (0 або більше), + (1 або більше), ? (0 або 1), {2,5} (від 2 до 5 разів).
  • Групи захоплення — круглі дужки (...) виділяють частину збігу, яку потім можна використати окремо, наприклад при заміні.
  • Якорі^ і $ прив’язують патерн до початку чи кінця рядка.

Жадібний проти лінивого пошуку

За замовчуванням квантифікатори «жадібні» — вони намагаються захопити якомога більше символів, а потім відступають, якщо це заважає знайти збіг. Наприклад, <.+> на рядку <a>text</a> захопить усе від першого < до останнього >. Додавання ? після квантифікатора (<.+?>) робить його «лінивим» — він захоплює якомога менше, зупиняючись на першому можливому збігу.

Типова помилка

Найчастіша помилка початківців — очікування, що жадібний квантифікатор зупиниться на першому логічному місці. У прикладі з HTML-тегами жадібний пошук навмисно чи ні захопить весь вміст між першим відкриваючим і останнім закриваючим тегом, а не окрему пару.

Навіщо це потрібно

  • Валідація формату вхідних даних (email, номер телефону, поштовий індекс).
  • Пошук і масова заміна тексту за патерном, а не точним збігом.
  • Витягування структурованих даних із логів чи неструктурованого тексту.

Катастрофічний backtracking

Вкладені квантифікатори на кшталт (a+)+ можуть на певних вхідних рядках змусити движок regex перебирати експоненційну кількість комбінацій, перш ніж визнати, що збігу немає, — сторінка чи сервер «зависають» на, здавалося б, простому виразі. Це реальна вразливість (ReDoS), тому складні вкладені квантифікатори варто тестувати на довгих «майже-збіжних» рядках, а не лише на очікуваних прикладах.

Спробувати інструмент