严格的正则表达式路由

时间:2013-02-01 10:51:08

标签: ruby sinatra

我最近一直在尝试使用Sinatra,而且我在使用基于正则表达式的路由时遇到了一些“问题”...例如,

get "/something/" do
  status 400
end

匹配/something,但/something//somethingelse都不匹配。然而,

get %r{/something/([0-9]{3})} do |number|
  status number
end

匹配/something/201,但也匹配/something/201/something/201-and-somethingelse。也许我应该重写正则表达式来阅读%r{/something/([0-9]+)$},但是对我来说包含美元符号是没有意义的,因为这个捕获应该是严格的,对吧?或者我错过了什么?

1 个答案:

答案 0 :(得分:2)

Sinata遵循Ruby的正常正则规则。来自IRB会议:

pattern = %r{/something/([0-9]{3})}
=> something[0-9]{3}
pattern.match "/something/201"
=> #<MatchData "/something/201" 1:"201">
pattern.match "/something/201/"
=> #<MatchData "/something/201" 1:"201">
pattern.match "something/201-and-somethingelse"
=> nil
pattern.match "/something/201-and-somethingelse"
=> #<MatchData "/something/201" 1:"201">

(这考虑到我上面指出的拼写错误。)

get "/something/" do的另一个示例是字符串,而不是正则表达式,但可以包含某些模式作为方便,例如?。因此:

get "/something/" do # will match "/something/" but not "/something"
get "/something" do # will match "/something" but not "/something/"
get "/something/?" do # will match "/something" and "/something/"