Перейти к основному содержимому

Регулярные выражения — группы и замена

Разработчику Аналитику

Предыдущий: синтаксис с нуля.
Следующий: проверки вокруг совпадения.
Примеры групп в готовых шаблонах — Regex — готовые паттерны (лог, дата, телефон).


Группы в RegExp - круглые скобки и захват

Круглые скобки делают две вещи:

  1. Группируют — квантификатор действует на весь блок — (ab)+ab, abab, …
  2. Захватывают — движок запоминает, какой текст попал внутрь, под номером 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})
ГруппаСодержимое
1916
2555
312
434

Альтернатива | — "или"

| выбирает левую или правую часть (часто на уровне целых кусков, не одной буквы).

(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.

  1. Поиск (regex):
(\d{4})-(\d{2})-(\d{2})
  1. Замена (пример для VS Code):
$3.$2.$1
ГруппаЗахват
12026 (год)
201 (месяц)
322 (день)

В строке замены $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\1r'\3.\2.\1'
C# Replace$1$3.$2.$1
.NET именованные$\&#123;day\&#125; или $<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
1abc
2a
3b
4c

Лишние группы усложняют замену ($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$&#123;10&#125; в JS, $10 в .NET осторожно
Экранирование в Python\1 в обычной строкесырой r"\1"
Лишние захватыпустые $3, $4(?:...)

Мини-практика

  1. Превратите user@domain.com в domain.com <user> (две группы вокруг @).
  2. Из строки лога вытащите уровень в отдельное поле для фильтра в Excel или скрипте.
  3. Найдите дубли слов в комментарии: \b(\w+)\s+\1\b.

Проверка — в лаборатории и на regex101.com.


Дальше: Проверки вокруг совпадения →