Excellent point, thank you for spotting that! I can confirm that the (?= ) around (?<lookback> ) can be removed in all cases in the root node (since (?<= ) is already zero-width). Makes the regexes even shorter! :-)
It's probably a vestige from the negative case like here or in the following, where the (?! (?<lookback> ... ) ) is needed*.
# Match any /\d./ that is *not* preceded by an /a/
my $re5 = qr{
(?! (?<lookback>
(?<=
a
|
(?=(?&lookback)) .
)
) )
(?<target> \d . )
}msx;
my $re5_short = qr
/(?!((?<= a |(?=(?-1)).))) (\d.) /sx;
for my $regex ($re5,$re5_short) {
unlike "fo", $regex;
unlike "x5", $regex;
unlike "ab5 x4", $regex;
like "5ab", $regex;
like "x5 ab5", $regex;
like "x5 ab5 x2", $regex;
my @results;
while ("x2 4x3a55aaa1" =~ /$regex/g)
{ push @results, $+{target} // $2 }
is_deeply \@results, ["2 ","4x","3a"];
}
* Update: Hmm, actually, it turns out this seems to work too... (although putting the exact explanation of why into words is eluding me at the moment...)
my $re5 = qr{
(?<lookback>
(?<!
a
|
(?!(?&lookback)) .
)
)
(?<target> \d . )
}msx;
my $re5_short = qr
/((?<! a |(?!(?-1)).)) (\d.) /sx;
|