0

我想检查 Rails 路由文件中不以“.json”结尾的 url

使用 $,我们可以匹配最后出现的内容,但我无法找到正则表达式最后没有字符串。

例如,

xyz.com/xjsonx
xyz.com/jsonx
xyz.com/jso

应该通过

xyz.com/xxx.json

不应该通过。

什么是正确的正则表达式?

4

4 回答 4

6

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]]
于 2013-07-30T17:44:41.523 回答
1

在这种情况下,您可以使用负前瞻技术:

^(.(?<!\.json))*?$

我相信这个正则表达式可以找到你想要的。

于 2013-07-30T17:44:24.827 回答
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
于 2013-07-30T18:23:05.043 回答
0

您可以使用仅执行一次后向操作的模式:

(?i)\S++(?<!\.json)

\S++代表所有不是白色字符(空格、制表符、换行符)一次或多次的字符。

但是如果需要,您可以用更明确的 url 格式描述来替换它。

(但是,如果您不必检查 url 格式,Babai 方式似乎是最好的)

注意:我没有添加锚点^,因为我不知道您是否要检查仅包含 url 而没有其他内容的字符串。虽然没用,但您可以添加起始锚点以使正则表达式更高效。

于 2013-07-30T18:22:14.690 回答