需要在Rails路由约束正则表达式中使用\ Z但是会出错

时间:2013-05-26 16:36:14

标签: ruby-on-rails regex routing routes

我需要允许路由匹配以下四种格式:

  • FOO
  • foo.json
  • foo.bar
  • foo.bar.json

如果路线以“.json”结尾,那么之前的部分应该匹配,因此这四个示例的唯一可能匹配是“foo”和“foo.bar”。

我提出了以下正则表达式:/.*?(?=\.json|\Z)/,但它不起作用,因为Rails不允许您在路由约束中使用\Z

  

路由要求中不允许使用正则表达式锚点字符:/.*?(?=\.json|\Z)/

我可以使用这个或另一个正则表达式吗?

5 个答案:

答案 0 :(得分:1)

以下正则表达式将匹配整个字符串并仅捕获您需要的部分

(.*?)(?:\.json)?$

http://regex101.com/r/sM6rD0

此正则表达式将匹配并仅捕获您需要的部分

^((?:.(?!\.json$))*(?:$|.))

http://rubular.com/r/SdtEDiWPRX

第二个正则表达式过于复杂,我非常怀疑你需要你的匹配和你的捕获是完全一样的。但话说回来,我对rails不太了解。)

答案 1 :(得分:1)

您应该能够创建自己的定义.matches的对象吗?方法。结合@ mrhobo的正则表达式应该可行。

http://guides.rubyonrails.org/routing.html#advanced-constraints

答案 2 :(得分:0)

您需要限制不是网址,但只能以这种方式格式化:

  get 'foo', format: /bar|json|bar\.json/, to: 'main#foo'

格式将在控制器中以params[:format]

的形式提供

答案 3 :(得分:0)

如果你想获得任意键,那不是那么简单:

get ":foo(.:bar)", to: 'main#foo', bar: /(?!json$|html$)[^\.]*/

您应该关注的一点是:bar不能是json(或任何其他适当的格式)

在您的控制器中,您将拥有params[:foo]params[:bar]

答案 4 :(得分:0)

我最终做的是创建两个不同的路由,一个路由端有JSON,另一个路径没有,两个路由都使用不同的正则表达式。所以以前的路线看起来像这样。

get ':foo', to: 'foo#bar', constraints: { foo: /.*?(?=\.json|\Z)/ }

现在看起来像这样:

get ':foo.json', to: 'foo#bar', constraints: { foo: /.*?(?=\.json)/ }, format: :json
get ':foo',      to: 'foo#bar', constraints: { foo: /.*?/ }