Regexp Question - Merb::Router


#1

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.

Cheers
Daniel


#2

2007/7/13, Daniel N removed_email_address@domain.invalid:

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: (?:slight_smile: is a non capturing regexp group. The
second “:” literally matches a single colon.

Kind regards

robert


#3

On 7/13/07, Robert K. removed_email_address@domain.invalid wrote:

It takes a route definition string, like “/products/:model/:id” and
second “:” literally matches a single colon.

Kind regards

robert

Thanx Robert,

I’ve not heard of that before. Makes searching on google much easier :slight_smile:

/(?::([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.

Cheers
Daniel


#4

2007/7/13, Daniel N removed_email_address@domain.invalid:

It’s actually two parts: (?:slight_smile: is a non capturing regexp group. The
/(?::([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


#5

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 G. II


#6

2007/7/13, James Edward G. II removed_email_address@domain.invalid:

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


#7

On 7/13/07, Robert K. removed_email_address@domain.invalid wrote:

can’t figure out how it works.
Regexps

irb(main):001:0> “/products/:model/:id”.scan %r{/:([^/]+)}
robert

I’m just trying to understand that regexp’s place in the Merb routing
code
at the moment.

You’ve cleared it up nicely for me.

Thankyou
Daniel