我有一个包含键和值的字符串:
original = 'key1="value1" key2="value2"'
我已经开始拆分空格:
items = original.split
=> ['key1="value1"', 'key2="value2"']
但现在我陷入困境,试图找到一种干净的方法将其变成哈希。如何轻松地将这个原始的键和值串转换为键和值的散列?
答案 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_object
:http://ruby-doc.org/core-2.2.0/Enumerable.html#method-i-each_with_object