我想检查 Rails 路由文件中不以“.json”结尾的 url
使用 $,我们可以匹配最后出现的内容,但我无法找到正则表达式最后没有字符串。
例如,
xyz.com/xjsonx
xyz.com/jsonx
xyz.com/jso
应该通过
但
xyz.com/xxx.json
不应该通过。
什么是正确的正则表达式?
String#end_with?
将是移动的好工具。
ar = ['xyz.com/xjsonx','xyz.com/jsonx','xyz.com/jso','xyz.com/xxx.json']
ar.map{|e| e.end_with? '.json'}
# => [false, false, false, true]
ar = ['xyz.com/xjsonx','xyz.com/jsonx','xyz.com/jso','xyz.com/xxx.json']
ar.map{|e| [e,e.end_with?('.json')]}
# => [["xyz.com/xjsonx", false],
# ["xyz.com/jsonx", false],
# ["xyz.com/jso", false],
# ["xyz.com/xxx.json", true]]
在这种情况下,您可以使用负前瞻技术:
^(.(?<!\.json))*?$
我相信这个正则表达式可以找到你想要的。
我喜欢保持简单,并会使用/\.json$/
NOT ( !
) 来反转测试结果:
%w[
xyz.com/xjsonx
xyz.com/jsonx
xyz.com/jso
xyz.com/xxx.json
].each do |s|
if !s[/\.json$/]
puts "#{s} passes"
else
puts "#{s} fails"
end
end
# >> xyz.com/xjsonx passes
# >> xyz.com/jsonx passes
# >> xyz.com/jso passes
# >> xyz.com/xxx.json fails
同样,更改条件的顺序并删除 NOT,也可以:
%w[
xyz.com/xjsonx
xyz.com/jsonx
xyz.com/jso
xyz.com/xxx.json
].each do |s|
if s[/\.json$/]
puts "#{s} fails"
else
puts "#{s} passes"
end
end
# >> xyz.com/xjsonx passes
# >> xyz.com/jsonx passes
# >> xyz.com/jso passes
# >> xyz.com/xxx.json fails
您可以使用仅执行一次后向操作的模式:
(?i)\S++(?<!\.json)
\S++
代表所有不是白色字符(空格、制表符、换行符)一次或多次的字符。
但是如果需要,您可以用更明确的 url 格式描述来替换它。
(但是,如果您不必检查 url 格式,Babai 方式似乎是最好的)
注意:我没有添加锚点^
,因为我不知道您是否要检查仅包含 url 而没有其他内容的字符串。虽然没用,但您可以添加起始锚点以使正则表达式更高效。