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

Групи без захоплення

Круглі дужки ( ) роблять дві справи водночас: вони групують частину шаблону і захоплюють її в $0, $1 тощо. Іноді потрібна лише перша справа — розглядати кілька атомів як одну одиницю, — не витрачаючи на це номера захоплення. Для цього використовують квадратні дужки [ ], які групують без захоплення.

Групування стає важливим, щойно ви чіпляєте квантифікатор. Квантифікатор зв’язується лише з атомом, що стоїть безпосередньо перед ним, тож наведений шаблон повторює саму лише останню літеру:

say 'abccc' ~~ / abc ** 3 /; # 「abccc」

Тричі повторилася тільки c. Загорніть увесь шматок у [ ], щоб повторити його весь:

say 'abcabcabc' ~~ / [ abc ] ** 3 /; # 「abcabcabc」

Тепер [ abc ] є однією одиницею, і ** 3 застосовується до групи.

Оскільки [ ] не займає слота захоплення, номери лишаються за тими частинами, які вам справді важливі. Порівняйте зі звичайним зіставленням ключа й значення:

if 'foo=42' ~~ / (\w+) '=' (\d+) / {
    say $0; # 「foo」
    say $1; # 「42」
}

Припустімо, перед ключем може стояти слово, яке ви хочете пропустити. Згрупуйте цей префікс через [ ], щоб він не порушив нумерації:

if 'the foo=42' ~~ / [ \w+ \s ]? (\w+) '=' (\d+) / {
    say $0; # 「foo」
    say $1; # 「42」
}

Необов’язковий [ \w+ \s ]? зіставився з the, але не забрав жодного захоплення, тож $0 і далі є ключем, а $1 — значенням. Якби ви записали цей префікс через ( ), усе б зсунулося: префікс став би $0, ключ — $1, а значення — $2.

Правило коротке: беріть ( ), коли хочете зберегти зіставлений текст, і [ ], коли хочете лише згрупувати. Обидва різновиди приймають квантифікатори й альтернативи, — саме тому в наведеній раніше альтернативі [ cat | dog ] house використано квадратні дужки: там потрібне було групування, а не ще одне захоплення.

Навігація курсом

Тест — Захоплення   |   Розберіть ім’я файлу


💪 Або перейдіть одразу до вправ цього розділу.