Экспертные регулярные выражения
🧙♂️ Экспертные техники регулярных выражений
Эти конструкции полезны для сложных сценариев обработки текста. Они не всегда поддерживаются во всех движках (например, JavaScript, Python, PCRE, .NET могут отличаться).
🧬 1. Балансирующие группы (только .NET)
Позволяют обрабатывать вложенные конструкции без рекурсии.
Пример:
^\((?>[^()]+|\((?<Depth>)|\)(?<-Depth>))*(?(Depth)(?!))\)$
Используется для проверки сбалансированных скобок.
🧠 2. Отрицательные и позитивные lookbehind’ы
Условие, что перед символом есть (или нет) шаблон.
(?<=\d{3})abc
—abc
после трёх цифр(?<!\d{3})abc
—abc
, не после трёх цифр
🔃 3. Atomic groups
Предотвращают backtracking.
Пример:
(?>\d+)
Это “жадный” захват — если не сработало, движок не будет пробовать другие варианты внутри группы.
🌀 4. Рекурсия (PCRE)
Вложенные шаблоны:
\((?:[^()]+|(?R))*\)
Используется для обработки вложенных скобок, тегов и пр.
🧾 5. Named capture groups (именованные группы)
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
Доступ к year
, month
, day
по имени.
📌 6. Inline flags
Изменяют поведение внутри шаблона.
Примеры:
(?i)
— регистронезависимый режим(?m)
— многострочный режим(?s)
— точка.
включает\n
Пример:
(?i)abc # будет найдено и ABC, и abc
⚠️ 7. Группы с ленивым захватом
Жадный поиск: .*
Ленивый: .*?
Пример:
".*"
— захватит всё между первой и последней кавычкой".*?"
— захватит только между ближайшими кавычками
🧠 Советы:
- Используйте отладчик: regex101.com
- Проверяйте поддержку: не все движки поддерживают recursion, lookbehind, atomic и т.д.
- Разбивайте сложные выражения на части