3

私は最近 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]+)$}がありますが、このキャプチャは厳密でなければならないため、ドル記号を含めることは意味がありませんよね? または、何か不足していますか?

4

1 に答える 1

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/"
于 2013-02-01T12:25:24.217 に答える