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