Перейти к основному содержимому
Модуль 4 · Урок 3 из 415/32 в курсе~10 min
Уроки модуля (3/4)

Группы без захвата: `(?:...)`

Часто круглые скобки нужны только для группировки (количественной оценки, чередования) и НЕ для извлечения значения. В этом случае используйте без захвата версия: (?:...). Он работает идентично (...), но не создает нумерованная группа.

Code
Pattern: (?:https?)://(\w+\.\w+)
Sample:  https://example.com e http://test.org
Match e gruppi:
  match  = "https://example.com"   gruppo1 = "example.com"
  match  = "http://test.org"        gruppo1 = "test.org"

(?:https?) группирует схему для применения квантора ?, но мы не заинтересован в извлечении https как группы: группа 1 является непосредственно домен.

Зачем это использовать

  1. Читаемость: читатель сразу понимает, что группа существует только для структуру, а не для извлечения значения.
  2. Производительность: движку не нужно сохранять совпадение группы.
  3. Чистая нумерация: пронумерованные группы остаются на одном уровне. «информация, которая мне действительно нужна», без вмешательства.

Оптимизация с помощью групп без захвата

Использование (?:...) указывает механизму применять правила группировки и квантификатора без траты памяти на хранение промежуточных результатов сопоставления. Это настоятельно рекомендуется при тяжелых циклах или очень длинной обработке текста.

Попробуйте это

Упражнение#regex.m4.l3.e1
Попыток: 0Загрузка…

Извлеките домен (example.com, test.org…) из каждого URL-адреса в тексте. Используйте `(?:https?)` для протокола (нет необходимости его захватывать) и одну группу для домена.

Загрузка редактора…
Показать подсказку

Измените первую группу с (https?) на (?:https?): ее не нужно захватывать, вам нужен только домен.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#regex.m4.l3.e2
Попыток: 0Загрузка…

Найдите каждое повторение `ab` как одно совпадение, но БЕЗ захвата группы (поскольку вам нужно только все совпадение).

Загрузка редактора…
Показать подсказку

Тот же синтаксис, что и в предыдущем уроке, но с (?:ab)+ вместо (ab)+.

Решение доступно после 3 попыток

Дополнительная задача

Упражнение#regex.m4.l3.e3
Попыток: 0Загрузка…

Find price digits followed optionally by decimal parts inside a non-capturing group, e.g. `100` or `100.50`.

Загрузка редактора…
Показать подсказку

Использовать (?:\\.\\d{2})? чтобы сделать десятичную часть необязательной, не захватывая ее.

Решение доступно после 3 попыток