Note: I would want "abcdef" =~ m/..*..*./g to return 20 = 6 choose 3 matches.You can add a simple counter to your regexes with (?{code}):
How does that fancy regex work? Every time it passes the "normal" part of the regex, it increments the counter, but the final (?!) part makes the overall expression fail and backtrack (back past the (?{code})) to try again. This process only stops when it has exhausted every possible way to match the "normal" part of the regex.local $_ = "abcdef"; my $count; /..*..*.(?{$count++})(?!)/; print "$count matches\n"; ## "20 matches"
There are some issues though: It's a little messy to reuse this, because to do it programatically requires use re 'eval', and lexicals that get closured inside regexes don't always behave like you think they should. You may have to resort to a symbol-table variable for the counter.
blokhead
In reply to Re: Regexes: finding ALL matches (including overlap)
by blokhead
in thread Regexes: finding ALL matches (including overlap)
by kaif
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |