【问题标题】:Find youtube url in json file with ruby使用 ruby​​ 在 json 文件中查找 youtube url
【发布时间】:2021-03-14 09:07:37
【问题描述】:

出于测试目的,我的 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

输出:“字符串不在文件中”

但字符串在文件中。

搜索其他字符串可以正常工作,所以一定是这个特定字符串有问题。

非常感谢任何帮助!

【问题讨论】:

  • 那么,出于测试目的,您的json 文件不是json 文件吗?
  • 有了那个 Ruby 代码,我得到了一个SyntaxError
  • 如果您不介意使用库,请查看github.com/talyssonoc/CommonRegexRuby

标签: ruby string search grep


【解决方案1】:

问题

您的正则表达式模式无效,因为其中的正斜杠太多。具体来说:

/https://www.youtube.com/watch?v=hBIZF3sDFTI/

不是一个有效的正则表达式。您的 String 也不是有效的 JSON 对象。

解决方案

在尝试使用您的模式之前,您需要转义特殊的正则表达式字符,例如 /?。例如,您可以像这样在字符串上调用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)可以有 zero 未转义表达式中的斜线。我想 OP 可以用%r{https://www.youtube.com/watch?v=hBIZF3sDFTI} 解决部分问题,但这只是把罐子踢了下去,因为任何文字构造函数都可能需要在未来的某个字符串中转义。
  • 即使在%r 中你也必须逃避.?,所以Regexp.escape 是要走的路。但是,请注意它返回一个 string。您可能希望 pattern 成为正则表达式。 (您的示例仍然有效,因为 match 转换了它,但这可能并不明显)
猜你喜欢
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多