Jaap has asked for the wisdom of the Perl Monks concerning the following question:

Ok i'm feeling pretty stupid here but i can't find the box to post a new question on Seekers of Perl Wisdom. If someone could move me there, it'd be much appreciated.

I was recently playing with the regex prime finder which looks something like this:
if ((1 x $_) =~ m/^(11+)(\1)+$/)
Now i tried this:
if ((1 x $_) =~ m/^(11+){2,}$/)
And this didn't work. Why doesn't this work?

Replies are listed 'Best First'.
Re: [regex] match 2 or more times
by kvale (Monsignor) on Mar 25, 2004 at 23:38 UTC
    The regex fails on , e.g., 5 because (11+){2,} can match different lengths for different instances: the first match will be of length 3 and the second will be of length 2.

    By contrast, the first regexp enforces every match to be the same length, thus effectively dividing without a remainder when it matches.

    -Mark

      Ah! That's it. Thank you for the explanation.
Re: [regex] match 2 or more times
by davido (Cardinal) on Mar 25, 2004 at 23:31 UTC
    YAPE::Regex::Explain can help here:

    use strict; use warnings; use YAPE::Regex::Explain; my $REx1 = qr/^(11+)(\1)+$/; my $REx2 = qr/^(11+){2,}$/; my $exp1 = YAPE::Regex::Explain->new($REx1)->explain; my $exp2 = YAPE::Regex::Explain->new($REx2)->explain; print 'm/^(11+)(\1)+$/', "\n", $exp1, "\n"; print 'm/^(11+){2,}$/', "\n", $exp2, "\n";

    And the output:

    m/^(11+)(\1)+$/ The regular expression: (?-imsx:^(11+)(\1)+$) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- ^ the beginning of the string ---------------------------------------------------------------------- ( group and capture to \1: ---------------------------------------------------------------------- 1 '1' ---------------------------------------------------------------------- 1+ '1' (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- ( group and capture to \2 (1 or more times (matching the most amount possible)): ---------------------------------------------------------------------- \1 what was matched by capture \1 ---------------------------------------------------------------------- )+ end of \2 (NOTE: because you're using a quantifier on this capture, only the LAST repetition of the captured pattern will be stored in \2) ---------------------------------------------------------------------- $ before an optional \n, and the end of the string ---------------------------------------------------------------------- ) end of grouping ---------------------------------------------------------------------- m/^(11+){2,}$/ The regular expression: (?-imsx:^(11+){2,}$) matches as follows: NODE EXPLANATION ---------------------------------------------------------------------- (?-imsx: group, but do not capture (case-sensitive) (with ^ and $ matching normally) (with . not matching \n) (matching whitespace and # normally): ---------------------------------------------------------------------- ^ the beginning of the string ---------------------------------------------------------------------- ( group and capture to \1 (at least 2 times (matching the most amount possible)): ---------------------------------------------------------------------- 1 '1' ---------------------------------------------------------------------- 1+ '1' (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ){2,} end of \1 (NOTE: because you're using a quantifier on this capture, only the LAST repetition of the captured pattern will be stored in \1) ---------------------------------------------------------------------- $ before an optional \n, and the end of the string ---------------------------------------------------------------------- ) end of grouping ----------------------------------------------------------------------

    There are some subtile differences, especially if you're relying on $1 and $2 after the match.


    Dave