Corso di Raku / Espressioni regolari e grammatiche / Espressioni regolari / Catture

Gruppi senza cattura

Le parentesi tonde ( ) fanno due lavori insieme: raggruppano una parte dello schema e la catturano in $0, $1 e così via. A volte vuoi solo il primo lavoro — trattare più atomi come un’unica unità — senza sprecarci un numero di cattura. Per questo usa le parentesi quadre [ ], che raggruppano senza catturare.

Il raggruppamento conta non appena attacchi un quantificatore. Un quantificatore si lega solo all’atomo che lo precede immediatamente, quindi lo schema qui sotto ripete solo l’ultima lettera:

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

Solo la c è stata ripetuta tre volte. Avvolgi tutto il pezzo in [ ] per ripeterlo per intero:

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

Ora [ abc ] è un’unica unità, e ** 3 si applica al gruppo.

Poiché [ ] non occupa alcun posto di cattura, i numeri restano riservati alle parti che ti interessano davvero. Confronta una semplice corrispondenza chiave-valore:

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

Supponi che la chiave possa essere preceduta da una parola che vuoi saltare. Raggruppa quel prefisso con [ ] così che non disturbi la numerazione:

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

L’opzionale [ \w+ \s ]? ha riconosciuto the ma non ha richiesto alcuna cattura, quindi $0 è ancora la chiave e $1 è ancora il valore. Se avessi scritto quel prefisso con ( ), tutto si sarebbe spostato: il prefisso sarebbe diventato $0, la chiave $1 e il valore $2.

La regola è breve: usa ( ) quando vuoi conservare il testo riconosciuto e [ ] quando vuoi solo raggruppare. Entrambi i generi accettano quantificatori e alternative, ed è per questo che la precedente alternativa [ cat | dog ] house usava le parentesi quadre: le serviva il raggruppamento ma non un’altra cattura.

Quiz — Catture   |   Dividete un nome di file


💪 Oppure vai direttamente agli esercizi di questa sezione.