Курс по 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 използваше квадратни скоби: нуждаеше се от групиране, но не и от още едно прихващане.

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

Тест — Прихващания   |   Разделете име на файл


💪 Или преминете направо към упражненията в този раздел.