我需要允许一个路径来匹配以下四种格式:
如果一个路由以".json“结尾,那么应该匹配前面的部分,因此这四个示例的唯一可能匹配是"foo”和"foo.bar“。
我想出了以下正则表达式:/.*?(?=\.json|\Z)/,但它不能工作,因为Rails不允许您在路由约束中使用\Z:
在路由要求中不允许Regexp锚字符:
/.*?(?=\.json|\Z)/
有什么方法可以绕过这个或另一个正则表达式吗?
发布于 2013-05-26 19:46:31
最后,我创建了两条不同的路径,一条在末尾有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: /.*?/ }发布于 2013-05-26 17:10:01
下面的regex将匹配整个字符串,并且只捕获所需的部分
(.*?)(?:\.json)?$http://regex101.com/r/sM6rD0
此正则表达式将只匹配并捕获所需的部分。
^((?:.(?!\.json$))*(?:$|.))http://rubular.com/r/SdtEDiWPRX
但是,第二个正则表达式太复杂了,我非常怀疑你是否需要你的匹配和捕获完全相同。但话说回来,我对rails不太了解:)
发布于 2013-05-26 18:54:10
您应该能够创建自己的对象来定义.matches吗?方法。这与@mrhobo的regex相结合应该是可行的。
http://guides.rubyonrails.org/routing.html#advanced-constraints
https://stackoverflow.com/questions/16761353
复制相似问题