奇怪的字符串分裂成红宝石?

时间:2013-08-26 16:50:10

标签: ruby

我有这个表达式“1 = 2,3 =(4 = 5,6 = 7)”并且我想创建一个Hash out of this - 1 => 2,3 => (4 = 5,6 = 7)。我可以通过2次传球。在第一遍中,我可以将(。*)转换为类似(4; 5,6; 7)的东西,然后在第二遍中做一些分裂。

有更好的解决方案吗?

1 个答案:

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

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