Регулярные выражения — группы и замена
Предыдущий: синтаксис с нуля.
Следующий: проверки вокруг совпадения.
Примеры групп в готовых шаблонах — Regex — готовые паттерны (лог, дата, телефон).
Группы в RegExp - круглые скобки и захват
Круглые скобки делают две вещи:
- Группируют — квантификатор действует на весь блок —
(ab)+→ab,abab, … - Захватывают — движок запоминает, какой текст попал внутрь, под номером 1, 2, 3…
Без скобок ab+ означает "a и один или больше символов b" (abbb), а не повтор пары ab.
Захват — разбор телефона
Текст:
Звоните: +7 916 555-12-34
Шаблон:
\+7\s(\d{3})\s\d{3}-\d{2}-\d{2}
| Часть | Значение |
|---|---|
\+7 | плюс и семёрка |
\s | пробел |
(\d{3}) | группа 1 — три цифры (код) |
\s\d{3}-\d{2}-\d{2} | остальной номер без отдельного захвата |
В коде после совпадения: группа 1 = 916. Остальное видно в полном совпадении, но не в отдельной "ячейке".
Чтобы захватить все блоки:
\+7\s(\d{3})\s(\d{3})-(\d{2})-(\d{2})
| Группа | Содержимое |
|---|---|
| 1 | 916 |
| 2 | 555 |
| 3 | 12 |
| 4 | 34 |
Альтернатива | — "или"
| выбирает левую или правую часть (часто на уровне целых кусков, не одной буквы).
(cat|dog)
Найдёт cat или dog.
\b(INFO|WARN|ERROR)\b
Уровни лога как отдельные слова.
(Т|т)елефон
Заглавная или строчная "Т" в начале слова.
Приоритет: (T|t)he|car — либо The/the, либо car. Скобки задают границы: The|the|car.
Обратная ссылка \1, \2
\1 — "тот же текст, что попал в группу 1".
Строка:
повтор повтор в тексте
Шаблон:
\b(\w+)\s+\1\b
| Часть | Значение |
|---|---|
\b | граница слова |
(\w+) | группа 1 — слово |
\s+ | пробелы |
\1 | то же слово, что в группе 1 |
\b | конец слова |
Найдёт повтор повтор.
В замене в редакторе VS Code/Cursor: $1 или \1 (зависит от движка) подставляет захваченный фрагмент.
Замена в редакторе
Задача: из 2026-01-22 сделать 22.01.2026.
- Поиск (regex):
(\d{4})-(\d{2})-(\d{2})
- Замена (пример для VS Code):
$3.$2.$1
| Группа | Захват |
|---|---|
| 1 | 2026 (год) |
| 2 | 01 (месяц) |
| 3 | 22 (день) |
В строке замены $3.$2.$1 подставляются день, месяц, год. Результат: 22.01.2026.
В лаборатории режим Замена и пресет Дата показывают именованные группы: $<year> в .NET-стиле.
Именованные группы
В .NET и JavaScript (современные движки):
(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})
Замена: $<day>.$<month>.$<year>.
Имена удобнее, когда групп много и легко перепутать $3 с $4.
Незахватывающая группа (?: ...)
Иногда скобки нужны только для повторения или для |, а запоминать текст не нужно.
(?:https?://)[^\s]+
| Часть | Значение |
|---|---|
(?:https?://) | http:// или https://, без захвата |
[^\s]+ | адрес до пробела |
Так массив групп в коде остаётся короче.
Подробнее о связке с проверками — в Регулярные выражения — проверки вокруг совпадения.
Валидация и извлечение — в чём разница
| Цель | Типичный шаблон |
|---|---|
| "Строка целиком — email?" | ^....@....\....$ |
| "Найти все email в абзаце" | те же куски без ^ $ или с границами \b |
Пример поиска в тексте:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
Пример проверки поля формы (упрощённо):
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
Практика — строка лога
2026-01-22 14:30:05 [ERROR] Connection timeout
Шаблон:
^(\d{4}-\d{2}-\d{2})\s+(\d{2}:\d{2}:\d{2})\s+\[(\w+)\]\s+(.+)$
| Группа | Поле |
|---|---|
| 1 | дата |
| 2 | время |
| 3 | уровень |
| 4 | сообщение |
Потренируйтесь в лаборатории — пресет Строка лога.
Замена в коде — синтаксис по языкам
После совпадения движок подставляет группы в строку замены. Нумерация с 1 (группа 0 — обычно всё совпадение целиком).
| Среда | Подстановка группы 1 | Пример |
|---|---|---|
| VS Code / Cursor (замена) | $1 | $3.$2.$1 |
JavaScript replace | $1 | '$3.$2.$1' |
Python re.sub | \1 | r'\3.\2.\1' |
C# Replace | $1 | $3.$2.$1 |
| .NET именованные | $\{day\} или $<day> | $<day>.$<month>.$<year> |
Python — сырой шаблон и замена:
import re
text = "Дата: 2026-01-22"
new = re.sub(r"(\d{4})-(\d{2})-(\d{2})", r"\3.\2.\1", text)
# Дата: 22.01.2026
JavaScript:
"2026-01-22".replace(/(\d{4})-(\d{2})-(\d{2})/, "$3.$2.$1");
// "22.01.2026"
C# (подробнее в разделе C#):
Regex.Replace("2026-01-22", @"(\d{4})-(\d{2})-(\d{2})", "$3.$2.$1");
В Python используйте r"...", в C# — @"...", чтобы \d не превратился в обычную букву d.
split и извлечение полей
Тот же шаблон с группами можно применить для разбиения строки.
Python:
re.split(r"\s*[,;]\s*", "a; b, c") # ['a', 'b', 'c']
JavaScript:
"2026-01-22 14:30:05".split(/[-\s:]/);
// ["2026", "01", "22", "14", "30", "05"]
Для сложных форматов (лог, CSV с кавычками) regex-split — первый шаг; надёжнее специализированный парсер.
Сколько групп запоминать
Каждая захватывающая ( увеличивает счётчик. Вложенные скобки нумеруются слева направо по открывающим (.
((a)(b)(c))
| Группа | Содержимое при совпадении abc |
|---|---|
| 1 | abc |
| 2 | a |
| 3 | b |
| 4 | c |
Лишние группы усложняют замену ($7 легко перепутать). Используйте (?:...) для вспомогательных блоков и именованные группы для читаемости.
Обратная ссылка в шаблоне и в замене
| Контекст | Синтаксис | Назначение |
|---|---|---|
| В шаблоне | \1, \2 | "тот же текст, что уже захвачен" |
| В замене (JS, C#) | $1, $2 | подстановка захвата |
| В замене (Python) | \1, \g<1> | то же |
Обратная ссылка в шаблоне требует, чтобы группа уже сработала раньше в том же совпадении. Шаблон (\w+)\s+\1 ищет повтор слова; (\w+)\s+\2 — ошибка (группа 2 ещё пуста).
Типичные ошибки с группами
| Ошибка | Следствие | Исправление |
|---|---|---|
Забыли скобки у | | ab|cd+ — не то, что ожидали | (ab)|(cd)+ |
$10 в замене | путается с $1 + 0 | ${10} в JS, $10 в .NET осторожно |
| Экранирование в Python | \1 в обычной строке | сырой r"\1" |
| Лишние захваты | пустые $3, $4 | (?:...) |
Мини-практика
- Превратите
user@domain.comвdomain.com <user>(две группы вокруг@). - Из строки лога вытащите уровень в отдельное поле для фильтра в Excel или скрипте.
- Найдите дубли слов в комментарии:
\b(\w+)\s+\1\b.
Проверка — в лаборатории и на regex101.com.
Дальше: Проверки вокруг совпадения →