in reply to Regexes: finding ALL matches (including overlap)
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
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Regexes: finding ALL matches (including overlap)
by nobull (Friar) on Jun 04, 2005 at 09:11 UTC | |
by blokhead (Monsignor) on Jun 04, 2005 at 12:21 UTC | |
by tlm (Prior) on Jun 04, 2005 at 13:45 UTC | |
by demerphq (Chancellor) on Jun 04, 2005 at 16:47 UTC | |
|
Re^2: Regexes: finding ALL matches (including overlap)
by kaif (Friar) on Jun 04, 2005 at 04:23 UTC | |
by ikegami (Patriarch) on Jun 04, 2005 at 04:51 UTC | |
|
Re^2: Regexes: finding ALL matches (including overlap)
by kaif (Friar) on Jun 04, 2005 at 18:00 UTC |