in reply to Regular Expressions

It`s interesting that...

In Java string 3601825932618111 doesn`t match with regex ^(?:(\d+)|::)*\1$ .
In seems to me, that ^ really doesn`t work in Perl (in this regex) or there is an error in syntax?

"This is perl, v5.8.4 built for i386-linux-thread-multi"

Nick <znick at inbox dot ru>

Replies are listed 'Best First'.
Re^2: Regular Expressions
by Roy Johnson (Monsignor) on May 17, 2005 at 21:13 UTC
    There's an error in your understanding, if you think that the ^ should cause the expression not to match. It matches the beginning of the string, then multiple digits any number of times. Then the last capture has to match at the end of string.

    You see, the * allows the group to match multiple times, and each time through, the capture group gets overwritten. So it can match everything up to "81" the first pass, then throw away that capture, capture "1" instead, and then the \1 matches, and the whole match succeeds.

    Sounds like Java's regex engine just doesn't try hard enough.


    Caution: Contents may have been coded under pressure.
      I understand that ^ here is "from the begining of the sting".
      I didn`t know, that each match would overwrite capture group. Thanks. :)
      I can`t find something about overwiting capture group in perlretut (am I a bad finder?). Are there any docs about it?
      Thanks. :)

      Nick <znick at inbox dot ru>
        I don't think it's documented. It's just a case of having one place to store a capture and capturing into it multiple times. Each time a capture happens, the old value is overwritten. I wish it were documented, though.

        Caution: Contents may have been coded under pressure.
Re^2: Regular Expressions
by mrborisguy (Hermit) on May 17, 2005 at 21:17 UTC
    does java's regex engines support the (?:) feature? that may also be why it's not matching.
      Yes, it supports (?:). But, probably, it doen`t overwite capture group each mach of (?:(\d+)|::).

      Nick <znick at inbox dot ru>