in reply to Trying to count the captures in a compiled regular expression
With respect to (?xism-xism:...), beware of the docs for this (my emphasis):
One or more embedded pattern-match modifiers, to be turned on (or turned off, if preceded by "-") for the remainder of the pattern or the remainder of the enclosing pattern group (if any).If I understand that correctly, the "only look at openings" approach will fail on something like:
or/(?x:((?-x:)) # (comment) )/
/((?-x:)) # (comment) /x
The simplistic (?{...}) parsing I referred to is in toke.c:scan_const(); look for the test
which simply counts unescaped braces until the opening one is closed - something like:else if (s[2] == '{' /* This should match regcomp.c */ || ((s[2] == 'p' || s[2] == '?') && s[3] == '{'))
would be fitting, though I suspect there must be a simpler way.our $re_true = qr{(?=)}x; our $re_false = qr{(?!)}x; our $count; / # (?{ ... }) or (??{ ... }) or (legacy) (?p{ ... }) \G \( \? (?: \? \?? | p ) (?= \{ ) (?{ local $count = 0; }) (?: \{ (?{ local $count = $count + 1 }) | \} (?{ local $count = $count - 1 }) | \\ . | . )+? (??{ $count == 0 ? $re_true : $re_false }) /xgc;
(consider how lucky I am that the regular expression engine is not reentrant...)
Now now, no need for that sort of language.
Hugo
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: Trying to count the captures in a compiled regular expression
by BooK (Curate) on May 03, 2004 at 06:50 UTC |