Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re: Lookahead assertion confusion

by steves (Curate)
on Jan 10, 2003 at 22:13 UTC ( [id://225978]=note: print w/replies, xml ) Need Help??


in reply to Lookahead assertion confusion

Thanks. I see the error of my ways. What I wanted was to capture the pieces as long as there were no intervening <p> tags in between. Stupid me was thinking the lookahead assertion checked if the expression was anywhere in between, whereas I had specified immediately following. Expanding the lookahead expression to a more compreshensive match was the key. I ended up using this regex to do the match:

($test =~ /(<p> )(?!.*<p>.*)(.+)(features\: <ul>)/i)

Replies are listed 'Best First'.
Re: Re: Lookahead assertion confusion
by Enlil (Parson) on Jan 10, 2003 at 23:12 UTC
    Without having more test cases it is hard to know whether your regex will work as you intended. Sure the one stated here works for this case, but it works just as well if you replace
    (?!.*<p>.*)
    with
    (?!.*<p>)
    .

    But I think you are missing the point of the assertion, as $1 now captures the second <p> in your string, and not the first, as the original had intended, which might not be important in this case, but might be in your understanding of what how better to approach regex problems) in which case:

    /<p>.*?(<p> )(.+)(features\: <ul>)/i
    or /[^(?:<p>)]+?(<p> )(.+)(features\: <ul>)/i works just as well. just because TMTOWTDI, doesn't mean that you have to use every tool in the toolshed to get to result when a simple screwdriver would have sufficed (pardon the expression).

    -enlil

Re: Re: Lookahead assertion confusion
by ihb (Deacon) on Jan 10, 2003 at 22:41 UTC
    Unfortunately that fails for '<p> ONE <p> TWO features: <ul> THREE <p>'.

    You can fix this by making the engine go one char at a time:   /(<p> )((?:(?!<p>).)*)(features: <ul>)/i Hope I've helped,
    ihb

    Update:
    Just for fun:   /(<p> )(?>(.*?)((<p>)|features: <ul>))(?(4)(?!))/i

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others about the Monastery: (4)
As of 2024-04-24 12:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found