Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re: Regex Optional capture doesn't

by LanX (Saint)
on Oct 05, 2017 at 16:34 UTC ( [id://1200744]=note: print w/replies, xml ) Need Help??


in reply to Regex Optional capture doesn't

I think .+ is greedy and eats the rest of the string.

But the regex is forced to backtrack if <(\w+TagIwant\b) is not optional otherwise it concludes happily.

Changing to .+? should solve this.

UPDATE

just tested, not my day. declaring myself officially (mentally) ill.

UPDATE

an elegant solution is buried at the end of this discussion here

Cheers Rolf
(addicted to the Perl Programming Language and ☆☆☆☆ :)
Je suis Charlie!

Replies are listed 'Best First'.
Re^2: Regex Optional capture doesn't
by NetWallah (Canon) on Oct 05, 2017 at 16:39 UTC
    It does not.

    Same result with ".+?".

                    All power corrupts, but we need electricity.

      Yep, just tested.

      But I think the explanation is still the same. (point 1)

      The fix doesn't work because the regex has to decide which non-greedy ? has "precedence".

      I know there are ways to handles this in one regex, but my advice is just to use a second one checking the tail of the string. (point 2)

      Cheers Rolf
      (addicted to the Perl Programming Language and ☆☆☆☆ :)
      Je suis Charlie!

        Hmmm

        > The fix doesn't work because the regex has to decide which non-greedy ? has "precedence".

        strange, it works like I initially thought

        DB<63> print join "|",'abc' =~ /a(.+?)(c)?/ b|c DB<64> print join "|",'abd' =~ /a(.+?)(c)?/ b|

        well you seem to have other issues I can't see.

        EDIT

        Interesting

        DB<84> print join "|",'a<c1<c2' =~ /(.+?)<(c.)?/ # ok a|c1 DB<85> print join "|",'a<b1<b2' =~ /(.+?)<(c.)?/ # ok a| DB<86> print join "|",'a<b1<c2' =~ /(.+?)<(c.)?/ # oops a|

        you might want to use use re 'debug' to parse whats happening.

        update

        ah now it's clearer

        DB<89> print join "|",'a<b1<c2' =~ /(.+?)(c.)?/ a|

        The non-greedy is finishing as soon as it succeeds, and c. is optional

        Cheers Rolf
        (addicted to the Perl Programming Language and ☆☆☆☆ :)
        Je suis Charlie!

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1200744]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (5)
As of 2024-04-19 23:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found