出于测试目的,我的json文件(test.json)仅包含我要查找的字符串:
"https://www.youtube.com/watch?v=hBIZF3sDFTI"
不知何故,我无法使用以下Ruby代码在文件中找到字符串:
if not File.foreach("test.json").grep(/https://www.youtube.com/watch?v=hBIZF3sDFTI/).any?
puts("string not in file")
end
输出:“字符串不在文件中”
但是字符串在文件中。
搜索其他字符串可以正常工作,因此此特定字符串一定是有问题的。
任何帮助深表感谢!
你的正则表达式模式无效,因为其中包含太多的正斜杠。具体来说:
/https://www.youtube.com/watch?v=hBIZF3sDFTI/
是不是一个有效的正则表达式。你的String也不是有效的JSON对象。
在尝试使用模式之前,你需要转义特殊的正则表达式字符(例如/
和)?
。例如,你可以像这样在String上调用Regexp#escape:
Regexp.escape 'https://www.youtube.com/watch?v=hBIZF3sDFTI'
#=> "https://www\\.youtube\\.com/watch\\?v=hBIZF3sDFTI"
然后,假设你具有有效的JSON对象,则可以按以下方式匹配表达式:
require 'json'
str = 'https://www.youtube.com/watch?v=hBIZF3sDFTI'
json = str.to_json
#=> "\"https://www.youtube.com/watch?v=hBIZF3sDFTI\""
pattern = Regexp.escape str
json.match pattern
#=> #<MatchData "https://www.youtube.com/watch?v=hBIZF3sDFTI">
“无效,因为它有太多的正斜杠” –多少个斜杠可以吗?;-)
@Stefan我知道您很幽默,但是为了将来的访问者受益,标准正则表达式文字(例如,不使用
%r
)在表达式中可以具有零个未转义的正斜杠。我想OP可以%r{https://www.youtube.com/watch?v=hBIZF3sDFTI}
用来解决部分问题,但是这可以解决问题,因为将来任何字符串中都可能需要转义任何文字构造函数。甚至在
%r
您必须逃脱.
和的情况下,前进的道路也是?
如此Regexp.escape
。但是,请注意,它返回一个string。您可能想pattern
成为一个正则表达式。(尽管如此,您的示例仍然有效,因为match
可以对其进行转换,但这可能并不明显)太好了,谢谢您的帮助!