Курс языка программирования Raku / Регулярные выражения и грамматики / Регулярные выражения / Захваты

Позиционные захваты

Заключите часть шаблона в круглые скобки ( ), чтобы захватить её. После успешного сопоставления каждый захваченный кусочек доступен как $0, $1 и так далее — нумерация идёт с нуля в порядке открытия скобок:

if '2025-06' ~~ / (\d+) '-' (\d+) / {
    say $0; # 「2025」
    say $1; # 「06」
}

Первая пара скобок захватила год в $0, вторая — месяц в $1. Текст между ними, буквальный -, сопоставляется, но не захватывается.

Каждый захват сам по себе является небольшим объектом совпадения, поэтому у него можно спросить .Str, позицию и прочее. В строке с двойными кавычками захват интерполируется как совпавший текст:

if 'hello world' ~~ / (\w+) ' ' (\w+) / {
    say "$1 $0"; # world hello
}

Здесь два захваченных слова печатаются в обратном порядке, то есть меняются местами.

Захваты хранятся и в переменной совпадения $/, а $0 — это на самом деле краткая запись для $/[0]. Работать можно и напрямую через $/:

if '2025-06' ~~ / (\d+) '-' (\d+) / {
    say $/[0];    # 「2025」
    say $/[1];    # 「06」
    say $/.elems; # 2
}

$/ — это весь объект совпадения, индексация добирается до позиционных захватов, а .elems сообщает, сколько их.

Практика

Пройдите 1 тест по содержанию этой темы.

Навигация по курсу

Захваты   |   Тест — Позиционные захваты


💪 Или перейдите сразу к упражнениям этого раздела.