Course of Raku / Regexes and grammars / Regexes / Captures

Positional captures

Put a part of the pattern in round brackets ( ) to capture it. After a successful match, each captured piece is available as $0, $1, and so on, numbered from zero in the order the brackets open:

if '2025-06' ~~ / (\d+) '-' (\d+) / {
    say $0; # 「2025」
    say $1; # 「06」
}

The first pair of brackets captured the year into $0, the second captured the month into $1. The text between them — the literal - — is matched but not captured.

Each capture is itself a small match object, so you can ask it for its .Str, its position, and so on. In a double-quoted string a capture interpolates as its matched text:

if 'hello world' ~~ / (\w+) ' ' (\w+) / {
    say "$1 $0"; # world hello
}

Here, the two captured words are printed in the opposite order, which swaps them.

The captures are also stored in the match variable $/, and $0 is really a short way of writing $/[0]. You can work through $/ directly:

if '2025-06' ~~ / (\d+) '-' (\d+) / {
    say $/[0];    # 「2025」
    say $/[1];    # 「06」
    say $/.elems; # 2
}

$/ is the whole match object, indexing it reaches the positional captures, and .elems tells you how many there are.

Practice

Complete the 1 quiz that covers the contents of this topic.

Course navigation

Captures   |   Quiz — Positional captures


💪 Or jump directly to the exercises in this section.