我有这个表达式“1 = 2,3 =(4 = 5,6 = 7)”并且我想创建一个Hash out of this - 1 => 2,3 => (4 = 5,6 = 7)。我可以通过2次传球。在第一遍中,我可以将(。*)转换为类似(4; 5,6; 7)的东西,然后在第二遍中做一些分裂。
有更好的解决方案吗?
答案 0 :(得分:3)
只要你不需要担心嵌套的括号,和 括号内的任何内容都将被视为普通字符串:
str = "1=2,3=(4=5,6=7)"
Hash[str.scan(/([^=,]+)=(\([^\)]+\)|[^=,]+)/)]
# => {"1"=>"2", "3"=>"(4=5,6=7)"}
如果需要嵌套哈希,请使用递归方法:
def hashify(str)
arr = str.scan(/([^=,]+)=(\([^\)]+\)|[^=,]+)/).map do |key, val|
if val[0] == '(' && val[-1] == ')'
[key, hashify(val[1..-2])]
else
[key, val]
end
end
Hash[arr]
end
hashify "1=2,3=(4=5,6=7)"
# => {"1"=>"2", "3"=>{"4"=>"5", "6"=>"7"}}
请注意,这仍然无法正确处理嵌套括号。你需要一个合适的解析器。