in reply to Re: why my reg ex matches greedy?
in thread why my reg ex matches greedy?

i did not make my own syntax and expect perl to understand it. it is just that i do not know what i was doing wrong over there and trying to seek help.

Replies are listed 'Best First'.
Re^3: why my reg ex matches greedy?
by roboticus (Chancellor) on Jun 25, 2012 at 22:20 UTC

    Well, clearly I'm an idiot. I thought I'd drop a mention of YAPE::Regex::Explain to show how to figure out what a regular expression is saying, so I could point out the "invented" bit. But I find that the bit I thought was "invented" seems fine. Sorry about that. When I run:

    use YAPE::Regex::Explain; print YAPE::Regex::Explain->new(qr/(.*)(_\d{11,}?.*)(\.\w+)/)->explain +();

    I get:

    And I thought the \d{11,}? was the invented bit. I'll have to play with that sometime.

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

      And I thought the \d{11,}? was the invented bit. I'll have to play with that sometime.

      You should, the future of all new perl regex features rests upon that syntax

        I don't see the relation between your link and that bit of the regex. However, that said, your skepticism of its utility seems justified. I tried to find a use for it, but I haven't been able to make \d{4,}? act any differently than \d{4}. It's either a useless construct, or a failure of my imagination in coming up with an appropriate test case.

        Putting aside what YAPE::Regex::Explain says about it, when I looked at it originally, I thought "Yack! Perl is gonna bitch about that weird '?' character". I could think of a couple other interpretations, so I put together a bit of code to check 'em out:

        my @tests = ( 'First case', '123456789second & third case', ); for my $t (@tests) { print "\nchecking '$t'\n"; + if ($t=~/(\d{4,}?)(.*)/) { print "A: $1, $2\n"; } if ($t=~/(\d{4,}?)(.*?)$/) { print "B: $1, $2\n"; } }

        The other interpretations I could think of were:

        • An optional set of 4 or more digits, kind of like (?:\d{4,})?. If true, the first case would give us:

          A: , First case'
        • Exactly 4 digits, like \d{4}, giving us:

          checking '123456789second & third case' A: 1234, 56789second & third case B: 1234, 56789second & third case
        • 4 or more digits, with as few as possible, yielding:

          checking '123456789second & third case' A: 1234, 56789second & third case B: 123456789, second & third case

        On reading the ...explain() output, I thought that I could perhaps make the third case come about. But what I actually got was:

        $ perl xxxyyyzzz.pl checking 'First case' checking '123456789second & third case' A: 1234, 56789second & third case B: 1234, 56789second & third case

        So I'm thinking that my initial surprise was justified, even though it's syntactically correct.

        ...roboticus

        When your only tool is a hammer, all problems look like your thumb.