liquid
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
liquid
2
2007/7/13, Daniel N [email protected]:
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
liquid
3
On 7/13/07, Robert K. [email protected] 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 
/(?::([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
liquid
4
2007/7/13, Daniel N [email protected]:
It’s actually two parts: (?
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
liquid
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
liquid
6
2007/7/13, James Edward G. II [email protected]:
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
liquid
7
On 7/13/07, Robert K. [email protected] 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