Sinatra:匹配任意数量的目录出现次数

时间:2013-04-08 16:04:09

标签: ruby regex sinatra

我得到了这条路线:

get %r{/content.json/([\w]+)/([\w]+)/} do
  ...
end

并且匹配“/content.json/123/abc”。 但是我希望匹配任意数量的目录,比如“/content.json/123/456/abc/def”并将这样的参数传递给我:

{"splat":[],"captures":["123","456","abc","def"]}

如何编写正则表达式?

2 个答案:

答案 0 :(得分:1)

执行此操作的一种可能方法是匹配单个组中的子目录,并将其拆分为路径本身:

get %r{/content.json/([\w\/]*)} do
  dirs = params[:captures][0].split("/");
  ...
end

根据请求/content.json/123/456/abc/defdirs将包含数组["123", "456", "abc", "def"]

答案 1 :(得分:0)

这是不可能的。单个正则表达式只能有固定数量的捕获(尽管其中一些可能最终捕获nil)。如果你设置了深度限制,比如说4,那么,你可以这样做:

%r{/content.json(?:/([\w]+))?(?:/([\w]+))?(?:/([\w]+))?(?:/([\w]+))?}