Ruby Regex在字符串末尾不匹配字符串

时间:2013-07-30 17:39:49

标签: ruby regex

我想在Rails路由文件

中检查不以“.json”结尾的网址

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

例如,

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

应该通过

xyz.com/xxx.json

不应该通过。

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

4 个答案:

答案 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的字符串而不是其他内容。尽管它没用,但您可以添加开始锚点以使正则表达式更高效。