我正在寻找单个正则表达式,该表达式将匹配长度为1个或多个字符不匹配500
的内容。这将在Rails路由文件中使用,特别是用于处理异常。
的routes.rb
match '/500', to: 'errors#server_error'
match '/:anything', :to => "errors#not_found", :constraints => { :anything => /THE REGEX GOES HERE/ }
我对如何定义与某些内容匹配的正则表达式并且同时与其他内容不匹配有点迷失。
答案 0 :(得分:2)
您可以使用此正则表达式来检查字符串是否不包含子字符串500:
\A(?>[^5]++|5++(?!00))+\z
如果你想允许5000或5500 ......,你可以这样做:
\A(?>[^5]++|5{2,}+|5(?!00(?!0)))+\z
第一个字符串说明:
\A # begining of the string
(?> # opening of an atomic group
[^5]++ # all characters but 5 one or more times (possessive)
| # OR
5++(?!00) # one or more 5 not followed by 00
)+ # closing of the atomic group, one or more times
\z # end of the string
Possessive quantifiers和atomic groups用于避免正则表达式引擎回溯以获得更好的性能(正则表达式很快失败)。
答案 1 :(得分:1)
Rails路由按它们在routes.rb中出现的顺序进行匹配。通过将/500
放在列表中的第一位(或更高位置),可以确保进一步向下的路由与/500
不匹配。你不应该担心这个。
所以,相反,将其拆分为更多路线。
match '/500', to: 'errors#server_error'
match '.*500.*', to: 'somewhere else'
match '/:anything', :to => "errors#not_found"
并且不用担心约束。
答案 2 :(得分:1)
你真的需要那个正则表达式吗?您的路线定义
match '/500', to: 'errors#server_error'
将捕获所有/500
个请求,这意味着您的下一个路由规则
match '/:anything', :to => "errors#not_found"
不会自动获取它们。
答案 3 :(得分:0)
正如评论中所述,这个正则表达式应该完成工作\A(?!500\z).+\z
。
<强>解释强>
\A
:匹配行的开头(?!500\z)
:负向前瞻,这意味着检查行\z
.+
:匹配任何字符一次或多次\z
:匹配行尾