如何通过Ruby中的分隔符拆分数组?

时间:2012-03-16 13:20:58

标签: ruby arrays parsing

例如,如果我有这样的数组:

[:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]

我想得到这个:

[[1, [2, 3], 4], [5]]

:open实际上变为[:close变为]

3 个答案:

答案 0 :(得分:10)

您可以使用堆栈执行此操作,但递归设计非常简单:

#!/usr/bin/env ruby

x = [:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]

def parse(list)
  result = []
  while list.any?
    case (item = list.shift)
    when :open
      result.push(parse(list))
    when :close
      return result
    else
      result.push(item)
    end
  end

  return result
end

puts parse(x).inspect

请注意,这会破坏原始阵列。如果你想保留它,你应该在传递之前clone

答案 1 :(得分:4)

ar = [:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]
p eval(ar.inspect.gsub!(':open,', '[').gsub!(', :close', ']'))
#=> [[1, [2, 3], 4], [5]]

答案 2 :(得分:0)

与steenslag相同,但更清洁

a = [:open, 1, :open, 2, 3, :close, 4, :close, :open, 5, :close]
eval(a.to_s.gsub(':open,','[').gsub(', :close',']'))
#=> [[1, [2, 3], 4], [5]]