Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical
 
PerlMonks  

Why does this simple grouping regex not match?

by december (Pilgrim)
on Feb 28, 2011 at 13:30 UTC ( [id://890557]=perlquestion: print w/replies, xml ) Need Help??

december has asked for the wisdom of the Perl Monks concerning the following question:

Hello fellow monks,

A quick question:

Why doesn't the first regex match while the second does?

$ perl -e '$_ = "(b)."; /\((?=a|b|c)\)/ && do { print "match!\n"; };' $ perl -e '$_ = "(b)."; /\((?=a|b|c)/ && do { print "match!\n"; };' match!

It's probably very simple and it has something to do with the use of grouping brackets instead of regular capturing brackets, but I don't seem to get why one works and the other doesn't – it's Monday and so far my brain has refused to accept that fact.

Thanks for any pointers!


EDIT: It's a typo. I overlooked the fact I typed an equal sign instead of a colon, accidently making it a look-ahead regex. Monday just isn't my day. Sorry folks!

Replies are listed 'Best First'.
Re: Why does this simple grouping regex not match?
by moritz (Cardinal) on Feb 28, 2011 at 13:34 UTC
    (?= ...) is not a "simple grouping", but a look-ahead (ie it looks for the presence of the regex within the group, but doesn't consume any characters).

    Use (?: ... ) for just grouping.

    (Update: fixed markup)

      I'm an idiot. It's a typo, I meant to use a colon in my code. I just kept on copying the same typo.

      Sorry folks!

        a healthy colon is vital to good health and vitality
Re: Why does this simple grouping regex not match?
by fisher (Priest) on Feb 28, 2011 at 13:38 UTC
    (?=a|b|c)
    I'm not sure how it iterprets exactly, but I think you need actually
    perl -e '$_ = "(b)."; /\([abc]\)/ && do { print "match!\n"; };'
    or
    perl -e '$_ = "(b)."; /\((a|b|c)\)/ && do { print "match!\n"; };'
Re: Why does this simple grouping regex not match?
by Anonymous Monk on Feb 28, 2011 at 13:58 UTC
    use re 'debug';
    perl -Mre=debug -e '$_ = q!(b).!; /\((?=a|b|c)\)/ && do { print qq{mat +ch! $&\n}; };' perl -Mre=debug -e '$_ = q!(b).!; /\((?=a|b|c)/ && do { print qq{match +! $&\n}; };'

      Interesting... didn't know about that. Noted for future use. Thanks!

Re: Why does this simple grouping regex not match?
by umasuresh (Hermit) on Feb 28, 2011 at 13:35 UTC
    Is this what you are looking for?
    $ perl -e '$_ = "(b)."; /(\(?=a|b|c\))/ && do { print "match!\n"; };' match!
    The outer parenthesis captures the match and the inner should be escaped!
    UPDATE
    Never mind, didn't pay attention to the atomic grouping!

Log In?
Username:
Password:

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

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

    No recent polls found