Cursus Raku / Reguliere expressies en grammatica’s / Reguliere expressies / Captures

Niet-vangende groepen

Ronde haken ( ) doen twee dingen tegelijk: ze groeperen een deel van het patroon en ze capturen het in $0, $1, enzovoort. Soms wil je alleen het eerste — meerdere atomen als één eenheid behandelen — zonder er een capturenummer aan te besteden. Gebruik daarvoor vierkante haken [ ], die groeperen zonder te capturen.

Groeperen doet ertoe zodra je er een kwantor aan hangt. Een kwantor bindt alleen aan het atoom er direct voor, dus het onderstaande patroon herhaalt slechts de laatste letter:

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

Alleen de c werd drie keer herhaald. Wikkel het hele stuk in [ ] om het geheel te herhalen:

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

Nu is [ abc ] één eenheid, en ** 3 hoort bij de groep.

Omdat [ ] geen captureplek inneemt, blijven de nummers gereserveerd voor de delen waar het je werkelijk om gaat. Vergelijk een gewone match van sleutel en waarde:

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

Stel dat de sleutel voorafgegaan kan worden door een woord dat je wilt overslaan. Groepeer dat voorvoegsel met [ ] zodat het de nummering niet verstoort:

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

De optionele [ \w+ \s ]? matchte the maar eiste geen capture op, dus is $0 nog steeds de sleutel en $1 nog steeds de waarde. Had je dat voorvoegsel met ( ) geschreven, dan zou alles opgeschoven zijn: het voorvoegsel zou $0 worden, de sleutel $1 en de waarde $2.

De regel is kort: gebruik ( ) wanneer je de gematchte tekst wilt bewaren, en [ ] wanneer je alleen wilt groeperen. Beide soorten accepteren kwantoren en alternatieven, en daarom gebruikte de eerdere alternatie [ cat | dog ] house vierkante haken — die had de groepering nodig maar geen extra capture.

Cursusnavigatie

Quiz — Captures   |   Splits een bestandsnaam


💪 Of ga direct naar de oefeningen in deze sectie.