我有一个需要解析的 JSON 片段:
fragment = "\"product name\":\"12 oz. Coke\", \"more keys\":\"another value\""
我想从给定键名的任何键中获取值。
我努力了:
fragment.match/\"product name\"\:\"(.+)\"/
但我得到未终止的字符串遇到文件结尾。
你能帮我抓住绳子12 oz. Coke
吗?
您不需要在正则表达式中转义引号,此外,添加一个 ? 标记以使搜索变得懒惰。这对我有用:
fragment = "\"product name\":\"12 oz. Coke\", \"more keys\":\"another value\""
p fragment[/"more keys":"(.+?)"/, 1] # => "another value"
p fragment[/"product name":"(.+?)"/, 1] # => "12 oz. Coke"
编辑:
另一种方法是将数据放入哈希中:
p Hash[fragment.gsub('"','').split(',').map{|x|x.strip.split(':')}]
# => {"product name"=>"12 oz. Coke", "more keys"=>"another value"}
您可以在“键值”模式中捕获“值”部分:
str = %q("product name":"12 oz. Coke", "more keys":"another value")
str.scan /".+?":"(.+?)"/
=> [["12 oz. Coke"], ["another value"]]
您可以使用JSON#parse和一些插值将您的字符串转换为普通的 Ruby哈希对象。哈希将公开各种有用的实用方法来获取您的数据。例如:
# use interpolation to convert to valid JSON, then parse to Hash
fragment = "\"product name\":\"12 oz. Coke\", \"more keys\":\"another value\""
hash = JSON.parse '{%s}' % fragment
#=> {"product name"=>"12 oz. Coke", "more keys"=>"another value"}
# manipulate your new Hash object
hash['product name']
#=> "12 oz. Coke"
hash.keys
#=> ["product name", "more keys"]
hash.values
#=> ["12 oz. Coke", "another value"]
Just to demonstrate how you might do this using the builtin JSON parser (if that were an option):
require 'json'
fragment = '"product name":"12 oz. Coke", "more keys":"another value"'
hash = JSON.parse('{' + fragment + '}')
hash['product name'] # => "12 oz. Coke"
我不确定 JSON 的所有格式,但一种方法是
Match the key name -- probably best to set case insensitive
Match the separator characters
Match anything that is not a termination character into a capturing group:
/product name[\\": ]+([^\\]+)/i
使用您的方法的另一种方法是使捕获组变得懒惰。还要记住,在 Ruby 中,您需要使用 \\ 而不是 \。所以:
/"\\"product name\\":\\"(.+?)\\/i
根据您的数据,您可能还需要打开“点匹配换行符”
/"\\"product name\\":\\"(.+?)\\/mi