Регулярний вираз (regex) — це компактний спосіб описати патерн тексту: не конкретний рядок, а правило, якому рядок повинен відповідати. Замість перебору символів у циклі можна одним виразом перевірити чи знайти складну структуру.
Базові будівельні блоки
- Класи символів —
\d(цифра),\w(буква/цифра/підкреслення),\s(пробільний символ), або власний клас[a-zA-Z]. - Квантифікатори —
*(0 або більше),+(1 або більше),?(0 або 1),{2,5}(від 2 до 5 разів). - Групи захоплення — круглі дужки
(...)виділяють частину збігу, яку потім можна використати окремо, наприклад при заміні. - Якорі —
^і$прив’язують патерн до початку чи кінця рядка.
Жадібний проти лінивого пошуку
За замовчуванням квантифікатори «жадібні» — вони намагаються захопити якомога більше символів, а потім відступають, якщо це заважає знайти збіг. Наприклад, <.+> на рядку <a>text</a> захопить усе від першого < до останнього >. Додавання ? після квантифікатора (<.+?>) робить його «лінивим» — він захоплює якомога менше, зупиняючись на першому можливому збігу.
Типова помилка
Найчастіша помилка початківців — очікування, що жадібний квантифікатор зупиниться на першому логічному місці. У прикладі з HTML-тегами жадібний пошук навмисно чи ні захопить весь вміст між першим відкриваючим і останнім закриваючим тегом, а не окрему пару.
Навіщо це потрібно
- Валідація формату вхідних даних (email, номер телефону, поштовий індекс).
- Пошук і масова заміна тексту за патерном, а не точним збігом.
- Витягування структурованих даних із логів чи неструктурованого тексту.
Катастрофічний backtracking
Вкладені квантифікатори на кшталт (a+)+ можуть на певних вхідних рядках змусити движок regex перебирати експоненційну кількість комбінацій, перш ніж визнати, що збігу немає, — сторінка чи сервер «зависають» на, здавалося б, простому виразі. Це реальна вразливість (ReDoS), тому складні вкладені квантифікатори варто тестувати на довгих «майже-збіжних» рядках, а не лише на очікуваних прикладах.