-1

我有这个表达式“1 = 2,3 =(4 = 5,6 = 7)”,我想从中创建一个哈希 - 1 => 2, 3 =>(4 = 5,6 = 7)。我可以在 2 遍中做到这一点。在第一遍中,我可以将 (.*) 转换为 (4;5,6;7) 之类的东西,然后在第二遍中进行一些拆分。

有更好的解决方案吗?

4

1 回答 1

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"}}

请注意,这仍然不能正确处理嵌套括号。你需要一个合适的解析器。

于 2013-08-26T17:00:52.480 回答