Re: I need regex last instance help

[email protected] (William Michels) Mon, 27 Oct 2025 08:21:04 -0700
Newsgroups perl.perl6.users
Message-ID <[email protected]>
Hi Todd,

Start by noting the `:g` "global" adverb (named-parameter). 
This means Raku will try to match the regex pattern against input multiple times.
Basically Raku will start from the left end of the input string, and try to find a match. 
The match will continue until the regex pattern fails. 
Then (because of the :global adverb), Raku moves down a character and starts all over again.

Without the zero-width start/end-of-line/string assertions, this is what you get:

[0] > .Str.say for "first line\nsecond line" ~~ m:g/ \w+ /
first
line
second
line

See remaining comments inline:

> On Oct 26, 2025, at 21:35, ToddAndMargo via perl6-users <[email protected]> wrote:
> 
> On 10/26/25 8:51 PM, William Michels wrote:
>> In the Raku REPL:
>> [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^ \w+ /
>> first
>> [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^^ \w+ /
>> first
>> second
>> [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $ /
>> second
>> [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $$ /
>> first
>> second
>> HTH, Bill.
>>> On Oct 26, 2025, at 14:50, ToddAndMargo via perl6-users <perl6- [email protected]> wrote:
>>> 
>>> On 10/26/25 7:56 AM, William Michels wrote:
>>>> ^^  has the regex meaning "start-of-line"
>>>> $$  has the regex meaning "end-of-line"
>>>> Compare to:
>>>> ^  has the regex meaning "start-of-string"
>>>> $  has the regex meaning "end-of-string"
>>>> If you're analyzing input linewise (for example using a one-liner with `-ne` or `-pe` flags),
>>>> then start-of-line equals start-of-string, and end-of-line equals end- of-string.
>>>> HTH, Bill.
>>> 
>>> 
>>> Can I talk you out of a few examples?
> 
> Hi Bill,
> 
> Thank you!
> 
> Would you double check my understanding?
> 
> -T
> 

> 
> Extract the first (^) word (\w+) from the first line

> [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^ \w+ /
> first

Above: CLOSE. Raku takes an input string, and is asked to find the `\w+` characters immediately adjacent to the `^` start-of-string zero-width assertion. There is only one "start-of-string".  FYI, because you never ask Raku to interrogate line-related information (e.g. match a `^^` or `$$` or "\n" or "\v"), Raku has no idea whether the input string is one line or many lines.

> 
> Extract the first (^^) word (\w+) from all the lines
> [0] > .Str.say for "first line\nsecond line" ~~ m:g/ ^^ \w+ /
> first
> second

Above: CORRECT (although you might want to say "...from EACH of the lines").

> 
> Extract the last ($) word (\w+) from the last line
> [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $ /
> second

Above: CLOSE. Raku takes an input string, and is asked to find the `\w+` characters immediately adjacent to the `$` end-of-string zero-width assertion. There is only one "end-of-string". Again, because you never ask Raku to interrogate line-related information (e.g. match a `^^` or `$$` or "\n" or "\v"), Raku has no idea whether the input string is one line or many lines. 

> 
> Extract the last ($$) word (\w+) from all the lines
> [0] > .Str.say for "line first\nline second" ~~ m:g/ \w+ $$ /
> first
> second

Above: CORRECT (although you might want to say "...from EACH of the lines").

HTH, Bill.