如何将一串键和值转换为Ruby哈希?

时间:2015-02-11 23:38:21

标签: ruby

我有一个包含键和值的字符串:

original = 'key1="value1" key2="value2"'

我已经开始拆分空格:

items = original.split
=> ['key1="value1"', 'key2="value2"']

但现在我陷入困境,试图找到一种干净的方法将其变成哈希。如何轻松地将这个原始的键和值串转换为键和值的散列?

4 个答案:

答案 0 :(得分:3)

如果您可以假设值周围的引号是正确平衡的,并且您的值中没有转义引号,则使用正则表达式非常简单:

Hash[*'key1="value1" key2="value2"'.scan(/(\b.*?)=(".*?")/).flatten]
# => {"key1"=>"\"value1\"", "key2"=>"\"value2\""}

或者在Ruby 2.2中:

'key1="value1" key2="value2"'.scan(/(\b.*?)=(".*?")/).to_h

否则,如果您只想拆分=并且您的值中没有空格:

'key1="value1" key2="value2"'.split.map {|pair| pair.split "=", 2 }.to_h

如果您的值可能有空格,那么您实际上需要编写一个有状态解析器。

答案 1 :(得分:2)

items_hash = original.tr('"','').split.collect {|i| i.split('=')}.to_h

答案 2 :(得分:2)

Hash[original.split.collect {|i| i.split('=')}]

首先,split为您提供了每个key="value"的数组:

> original.split
=> ["key1=\"value1\"", "key2=\"value2\""]

然后,collect + split将每个key="value"子数组转换为[key,value]数组:

> original.split.collect {|i| i.split('=')}
=> [["key1", "\"value1\""], ["key2", "\"value2\""]]

最后,传递给Hash构造函数:

> Hash[original.split.collect {|i| i.split('=')}]
=> {"key2"=>"\"value2\"", "key1"=>"\"value1\""}

答案 3 :(得分:0)

这一点怎么样:

original.split.each_with_object({}) do |el, h| 
   parts = el.split("=")
   h[parts.first] = parts.last.gsub("\"", '') 
end

=> {
  "key1" => "value1",
  "key2" => "value2"
}

我建议您查看Enumerable模块,并在此处使用each_with_objecthttp://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-each_with_object