Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^7: This regexp made simpler

by moritz (Cardinal)
on Apr 26, 2010 at 11:36 UTC ( #836890=note: print w/ replies, xml ) Need Help??


in reply to Re^6: This regexp made simpler
in thread This regexp made simpler

I haven't really thought about whether the solutions with .*? are actually incorrect, but most of them will almost certainly go wrong if you extend the regex latern on with something that might force backtracking on the preceeding construct.

Example:

$ perl -wE 'say "yes" if "A BCZD ZA" =~ /^A(\s.*?)?ZA/' yes
Here I added an A to the end, which causes backtracking when there's no A after the first Z. Which in turn allows a match that was forbidden by your rules.

(Update: This is a general problem when translating "may not occur inbetween" to "minimum match": it's only the same under certain very fixed conditions. You can "rescue" such a solution by putting it in (?>...) non-backtracking groups, but I still recommend against it).

So maybe your example wasn't actually wrong (and I apologize for having called it so without any proof), but it's surely not very maintainable, because a very simple, innocent change can break it.


Comment on Re^7: This regexp made simpler
Select or Download Code
Replies are listed 'Best First'.
Re^8: This regexp made simpler
by rubasov (Friar) on Apr 26, 2010 at 14:31 UTC
    To satisfy my curiosity I wrote the backtracking control version you mentioned and I was surprised how simple it is:
    while (<DATA>) { print; s[ ^ (START) ( | \s.*? ) (END) (*COMMIT) $ ] [ $1 . $2 . 'insert' . $3 ]ex; print; } __DATA__ STARTEND STARTENDEND START SOMETHING END STARTSOMETHINGEND START END START ENDEND STARTSTARTENDEND STARTSTART ENDEND

    For comparison here's the other form:

    s[ ^ (START) ( | \s (?:(?!END).)* ) (END) $ ] [ $1 . $2 . 'insert' . $3 ]ex;
Re^8: This regexp made simpler
by rovf (Priest) on Apr 26, 2010 at 12:06 UTC
    I see the problem. Thanks for pointing this out!


    -- 
    Ronald Fischer <ynnor@mm.st>

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (10)
As of 2015-07-08 06:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (94 votes), past polls