我有一个看起来像这样的字符串:
greetings = <<-GREETINGS
[{a: "hello", b: "goodbye"}, {a: "guten tag", b: "auf wiedersehen"}]
GREETINGS
如何拆分此字符串,以返回哈希数组?
如果你信任源(并且仅当你信任源时,这可能不是真的(:
data = eval(str)
如果您不这样做(这种情况应该接近 100%(,那么您可以使用parsr
gem
data = Parsr.literal_eval(str)
你也可以写自己的语法,但是...为什么?:)
require 'json'
JSON.parse(greetings.gsub(/(p{Alnum})+:/, '"1":')).
map { |h| h.transform_keys(&:to_sym) }
#=> [{:a=>"hello", :b=>"goodbye"},
# {:a=>"guten tag", :b=>"auf wiedersehen"}]
步骤如下:
str = greetings.gsub(/(p{Alnum})+:/, '"1":')
#=> "[{"a": "hello", "b": "goodbye"}, {"a": "guten tag", "b": "auf wiedersehen"}]n"
arr = JSON.parse(str)
#=> [{"a"=>"hello", "b"=>"goodbye"},
# {"a"=>"guten tag", "b"=>"auf wiedersehen"}]
arr.map { |h| h.transform_keys(&:to_sym) }
#=> [{:a=>"hello", :b=>"goodbye"},
# {:a=>"guten tag", :b=>"auf wiedersehen"}]
正则表达式为"匹配捕获组 1 中的一个或多个字母数字字符,后跟冒号"。gsub
替换字符串中的1
将替换为捕获组 1 的内容。
参见 JSON::p arse、String#gsub 和 Hash#transform_keys。