我最近一直在尝试使用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]+)$}
,但是对我来说包含美元符号是没有意义的,因为这个捕获应该是严格的,对吧?或者我错过了什么?
答案 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/"