---
title: Экспертные регулярные выражения
slug: регулярные-выражения/экспертные-регулярные-выражения
---
# 🧙‍♂️ Экспертные техники регулярных выражений

Эти конструкции полезны для сложных сценариев обработки текста. Они не всегда поддерживаются во всех движках (например, JavaScript, Python, PCRE, .NET могут отличаться).

---

## 🧬 1. Балансирующие группы (только .NET)

Позволяют обрабатывать вложенные конструкции без рекурсии.

**Пример:**

```regex
^\((?>[^()]+|\((?<Depth>)|\)(?<-Depth>))*(?(Depth)(?!))\)$
```

Используется для проверки сбалансированных скобок.

---

## 🧠 2. Отрицательные и позитивные lookbehind'ы

Условие, что **перед символом** есть (или нет) шаблон.

- `(?<=\d{3})abc` — `abc` после трёх цифр
- `(?<!\d{3})abc` — `abc`, не после трёх цифр

---

## 🔃 3. Atomic groups

Предотвращают backtracking.

**Пример:**

```regex
(?>\d+)
```

Это "жадный" захват — если не сработало, движок не будет пробовать другие варианты внутри группы.

---

## 🌀 4. Рекурсия (PCRE)

Вложенные шаблоны:

```regex
\((?:[^()]+|(?R))*\)
```

Используется для обработки вложенных скобок, тегов и пр.

---

## 🧾 5. Named capture groups (именованные группы)

```regex
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
```

Доступ к `year`, `month`, `day` по имени.

---

## 📌 6. Inline flags

Изменяют поведение внутри шаблона.

**Примеры:**

- `(?i)` — регистронезависимый режим
- `(?m)` — многострочный режим
- `(?s)` — точка `.` включает `\n`

Пример:

```regex
(?i)abc # будет найдено и ABC, и abc
```

---

## ⚠️ 7. Группы с ленивым захватом

Жадный поиск: `.*`  
Ленивый: `.*?`

**Пример:**

- `".*"` — захватит всё между первой и последней кавычкой
- `".*?"` — захватит только между ближайшими кавычками

---

## 🧠 Советы:

- Используйте отладчик: [regex101.com](https://regex101.com/)
- Проверяйте поддержку: не все движки поддерживают recursion, lookbehind, atomic и т.д.
- Разбивайте сложные выражения на части
