我想在Rails路由文件
中检查不以“.json”结尾的网址使用$,我们可以匹配最后出现的内容,但我无法找到正则表达式,最终没有字符串。
例如,
xyz.com/xjsonx
xyz.com/jsonx
xyz.com/jso
应该通过
但
xyz.com/xxx.json
不应该通过。
这个正确的正则表达式是什么?
答案 0 :(得分:5)
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]]
答案 1 :(得分:1)
您可以在此方案中使用否定先行技术:
^(.(?<!\.json))*?$
我相信这个正则表达式可以找到你想要的东西。
答案 2 :(得分:1)
我喜欢保持简单,并使用/\.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
答案 3 :(得分:0)
您可以使用仅执行一个lookbehind的此模式:
(?i)\S++(?<!\.json)
\S++
代表所有不是白色字符(空格,制表符,换行符)的字符一次或多次。
但是如果需要,可以通过更明确的url格式描述来替换它。
(但如果您不必检查网址格式,Babai方式似乎是最好的)
注意:我没有添加锚^
,因为我不知道你是否要检查只包含url的字符串而不是其他内容。尽管它没用,但您可以添加开始锚点以使正则表达式更高效。