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

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

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

Предыдущий: синтаксис с нуля.
Следующий: проверки вокруг совпадения.


Группы в 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]+адрес до пробела

Так массив групп в коде остаётся короче.

Подробнее о связке с проверками — в 1113.


Валидация и извлечение — в чём разница

ЦельТипичный шаблон
«Строка целиком — 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сообщение

Потренируйтесь в лаборатории — пресет Строка лога.


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

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).