2015-02-11 51 views
0

我有一个包含键和值的字符串:如何将一串键和值转换为Ruby哈希?

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

我已经分裂的空间开始:

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

但现在我卡试图找到一个干净的方式把这个成哈希。我怎样才能轻松地将这个原始的键和值的字符串转换为键和值的散列?

+1

是“key1”和“key2”的关键字,还是变量'key1'和'key2'的值?这些值是“”value1“”和“”value2“”还是“”value1 \“”和'“\”value2 \“”'? – 2015-02-12 01:02:26

+0

这些值应该是'value1'而不是'“value1”' – Andrew 2015-02-12 01:30:51

+0

我编辑了我的答案以处理多余的引号。基本上你只需在原始文件中添加'.tr(''','')' – Ninjarabbi 2015-02-12 07:31:32

回答

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 

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

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

+0

那么,downvote为一个工作代码...聪明! – dgilperez 2015-02-11 23:57:53

+0

不知道为什么投票...我会给 – Andrew 2015-02-12 01:36:49

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

''.to_h''不是Ruby <2.2的数组定义方法。 – dgilperez 2015-02-11 23:50:16

+0

@dgilperez我不知道你是否在做梦。'to_h'是一个Array方法。 – sawa 2015-02-11 23:51:20

+1

@dgilperez这是在Ruby 2.2以上版本。 – 2015-02-11 23:52:06

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[original.split.collect {|i| i.split('=')}] 
=> {"key2"=>"\"value2\"", "key1"=>"\"value1\""} 
+0

它会工作,但你的'*'和'flatten'是多余的。 – sawa 2015-02-11 23:53:31

+0

不......没有'扁平化',你会得到不同的结果。而不是所需的输出,你会得到'{[“key1”,''value1'''] => [“key2”,''value2'']} - - 即第一个键/值作为新的散列键和下一个键/值作为新的散列值。 – DreadPirateShawn 2015-02-11 23:58:30

+0

我不打算每个人都分开冗余。我说他们是多余的。 – sawa 2015-02-12 00:00:20

相关问题