1

要解析的字符串(不带空格):

 "instrumentalist  (  bass  (upright  , fretless , 5-string ) ,  guitar  ( electric , acoustic ) ,  trumpet  ),  teacher  ,  songwriter,    producer"

我需要在 Ruby 中得到这个结构

["instrumentalist",[["bass",["upright","fretless","5-string"]],["guitar",["electric","acoustic"]],["trumpet"]],["teacher"],["songwriter"],["producer"]]

因为嵌套了,(帮不了我。我真的不知道是否有一个花哨的 RegEx 可以提取这种类型的字符串。还是我必须使用词法分析器?), String#partition

4

1 回答 1

8

一个正则表达式本身并不是解决这类问题的正确方法,尽管基本过程很简单:遍历你的字符串以查找逗号或括号。当您找到逗号时,将先前读取的字符添加到当前嵌套中。当你找到一个左括号时,你的嵌套级别会增加 1,当你找到一个右括号时,会降低它。

StringScanner 是为这类东西而设计的,因为它允许我们遍历字符串,同时保持某种状态,在这种情况下,是一个镜像你的开始和结束括号的堆栈。像这样的东西对我有用

require 'strscan'

def parse input
  scanner = StringScanner.new input
  stack = [[]]
  while string = scanner.scan(/[^(),]+/)
    case scanner.scan /[(),]+/
    when '('
      new_nesting = [string, []]
      stack.last << new_nesting
      stack << new_nesting[1]
    when ')'
      scanner.scan(/,/)
      stack.last << string
      stack.pop
    else
      stack.last << string
    end
  end
  stack.last
end
于 2013-07-27T07:33:03.233 回答