Курс 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
використано квадратні дужки: там потрібне було групування, а не ще одне
захоплення.
Навігація курсом
← Тест — Захоплення | Розберіть ім’я файлу →
💪 Або перейдіть одразу до вправ цього розділу.