Raku-Kurs / Reguläre Ausdrücke und Grammatiken / Reguläre Ausdrücke / Captures

Nicht einfangende Gruppen

Runde Klammern ( ) erledigen zwei Aufgaben auf einmal: Sie gruppieren einen Teil des Musters und capturen ihn in $0, $1 und so weiter. Manchmal wollen Sie nur die erste Aufgabe — mehrere Atome als eine Einheit behandeln —, ohne dafür eine Capture-Nummer zu verbrauchen. Nehmen Sie dafür eckige Klammern [ ], die ohne Capture gruppieren.

Das Gruppieren wird wichtig, sobald Sie einen Quantor anhängen. Ein Quantor bindet nur an das Atom unmittelbar davor, das folgende Muster wiederholt also nur den letzten Buchstaben:

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

Nur das c wurde dreimal wiederholt. Hüllen Sie das ganze Stück in [ ], um alles zu wiederholen:

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

Nun ist [ abc ] eine Einheit, und ** 3 bezieht sich auf die Gruppe.

Weil [ ] keinen Capture-Platz belegt, bleiben die Nummern für die Teile reserviert, auf die es Ihnen wirklich ankommt. Vergleichen Sie einen schlichten Treffer aus Schlüssel und Wert:

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

Nehmen wir an, dem Schlüssel darf ein Wort vorangehen, das Sie überspringen möchten. Gruppieren Sie dieses Präfix mit [ ], damit es die Nummerierung nicht stört:

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

Das optionale [ \w+ \s ]? hat the getroffen, aber kein Capture beansprucht, $0 ist also weiterhin der Schlüssel und $1 weiterhin der Wert. Hätten Sie jenes Präfix mit ( ) geschrieben, wäre alles verrutscht: Das Präfix würde $0, der Schlüssel $1 und der Wert $2.

Die Regel ist kurz: Nehmen Sie ( ), wenn Sie den getroffenen Text behalten wollen, und [ ], wenn Sie nur gruppieren wollen. Beide Arten nehmen Quantoren und Alternativen auf, weshalb die frühere Alternation [ cat | dog ] house eckige Klammern verwendet hat — sie brauchte die Gruppierung, aber kein weiteres Capture.

Kursnavigation

Quiz — Captures   |   Zerlegen Sie einen Dateinamen


💪 Oder springen Sie direkt zu den Übungen dieses Abschnitts.