Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby正则表达式与字符串末尾的字符串不匹配_Ruby_Regex - Fatal编程技术网

Ruby正则表达式与字符串末尾的字符串不匹配

Ruby正则表达式与字符串末尾的字符串不匹配,ruby,regex,Ruby,Regex,我想检查Rails路由文件中不以“.json”结尾的URL 使用$,我们可以匹配最后出现的内容,但我无法找到regex结尾没有字符串 比如说, xyz.com/xjsonx xyz.com/jsonx xyz.com/jso 应该通过 但是 不应该通过 对此,什么是正确的正则表达式?您可以在此场景中使用负前瞻技术: ^(.(?<!\.json))*?$ ^(.)? 我相信这个正则表达式可以找到你想要的。将是移动的好工具 ar = ['xyz.com/xjsonx','xyz.com/j

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

使用$,我们可以匹配最后出现的内容,但我无法找到regex结尾没有字符串

比如说,

xyz.com/xjsonx
xyz.com/jsonx
xyz.com/jso
应该通过

但是

不应该通过


对此,什么是正确的正则表达式?

您可以在此场景中使用负前瞻技术:

^(.(?<!\.json))*?$
^(.)?
我相信这个正则表达式可以找到你想要的。

将是移动的好工具

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]


您可以使用此模式仅执行一次查找:

(?i)\S++(?<!\.json)
(?i)\S++(?
\S++
代表所有非白色字符(空格、制表符、换行符)一次或多次

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

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


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

我希望保持它的简单性,并将
/\.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

你试过什么吗?@ToastyMallows是的,我试过(json(?!$)但是它不起作用这是正确的答案,但也许你可以把
$
放在负向前看中。这样,只有当字符串不是以
.json
结尾时,它才会匹配,类似
example.com/test.jsontest.html
的东西可以通过。有趣的是,我已经在很多情况下尝试过正则表达式,并且它通过了一个测试所有规则,包括您的示例。如果您在routes文件中使用它,则不需要
^
$
,因为它们自动位于每个规则的开始和结束处。(Rails默认)感谢这两个有趣的解决方案!它们工作正常,但当我将它们添加到rails路由代码中时,我得到一个错误:“路由要求中不允许使用Regexp锚字符”@Pajajah您是否删除了
^
$
符号?非常感谢@Babai,但不幸的是,我无法在Rails路线中使用此express。
%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
%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