[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: Regexp Question - Merb::Router

Robert Klemme

7/13/2007 7:50:00 AM

2007/7/13, Daniel N <has.sox@gmail.com>:
> Hi,
>
> I'm looking through the Merb::Routing code and I've found a regexp that I
> can't figure out how it works.
>
> Merb::Router::SECTION_REGEXP #=> /(?::([a-z*_]+))/
>
> It takes a route definition string, like "/products/:model/:id" and
> extracts the "model" string on the first pass, and later the "id" string.
>
> Can anyone shed some light on what the
> ?::
> part does? I haven't found it in any of the documentation for Ruby Regexps
> that I've found.

It's actually *two* parts: (?:) is a non capturing regexp group. The
second ":" literally matches a single colon.

Kind regards

robert

3 Answers

Robert Klemme

7/13/2007 8:22:00 AM

0

2007/7/13, Daniel N <has.sox@gmail.com>:
> On 7/13/07, Robert Klemme <shortcutter@googlemail.com> wrote:
> >
> > 2007/7/13, Daniel N <has.sox@gmail.com>:
> > > Hi,
> > >
> > > I'm looking through the Merb::Routing code and I've found a regexp that
> > I
> > > can't figure out how it works.
> > >
> > > Merb::Router::SECTION_REGEXP #=> /(?::([a-z*_]+))/
> > >
> > > It takes a route definition string, like "/products/:model/:id" and
> > > extracts the "model" string on the first pass, and later the "id"
> > string.
> > >
> > > Can anyone shed some light on what the
> > > ?::
> > > part does? I haven't found it in any of the documentation for Ruby
> > Regexps
> > > that I've found.
> >
> > It's actually *two* parts: (?:) is a non capturing regexp group. The
> > second ":" literally matches a single colon.
> >
> > Kind regards
> >
> > robert
> >
> > Thanx Robert,
>
> I've not heard of that before. Makes searching on google much easier :)
>
> /(?::([a-z*_]+))/
>
> I guess this means that a nested group within this non capturing group (this
> case) is captured though since the $1 variable is refered to later.

Exactly. Btw, in your case I'd probably use another regexp. Some samples:

irb(main):001:0> "/products/:model/:id".scan %r{/:([^/]+)}
=> [["model"], ["id"]]
irb(main):002:0> "/products/:model/:id".scan %r{:([^/]+)}
=> [["model"], ["id"]]
irb(main):004:0> "/products/:model/:id".scan %r{:[^/:]+}
=> [":model", ":id"]

But of course I do not know the full spec of your input data.

Kind regards

robert

James Gray

7/13/2007 2:27:00 PM

0

On Jul 13, 2007, at 3:12 AM, Daniel N wrote:

> /(?::([a-z*_]+))/
>
> I guess this means that a nested group within this non capturing
> group (this
> case) is captured though since the $1 variable is refered to later.

Yes. The part without the colon is capture, because of the normal
parenthesis.

Unless this expression is later embedded in another expression, the
non-capturing group does nothing here and could safely be removed.

James Edward Gray II

Robert Klemme

7/13/2007 2:46:00 PM

0

2007/7/13, James Edward Gray II <james@grayproductions.net>:
> On Jul 13, 2007, at 3:12 AM, Daniel N wrote:
>
> > /(?::([a-z*_]+))/
> >
> > I guess this means that a nested group within this non capturing
> > group (this
> > case) is captured though since the $1 variable is refered to later.
>
> Yes. The part without the colon is capture, because of the normal
> parenthesis.
>
> Unless this expression is later embedded in another expression, the
> non-capturing group does nothing here and could safely be removed.

Even in that case the grouping can be removed:

irb(main):002:0> /foo/.to_s
=> "(?-mix:foo)"
irb(main):003:0> /(?:foo)/.to_s
=> "(?-mix:foo)"

Kind regards

robert