Ruby正则表达式与字符串末尾的字符串不匹配
我想检查Rails路由文件中不以“.json”结尾的URL 使用$,我们可以匹配最后出现的内容,但我无法找到regex结尾没有字符串 比如说,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
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