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

ネストされているため、私(を助けることができませんでした。そのようなタイプの文字列を抽出できる派手な正規表現があるかどうかはよくわかりません。それとも、レクサーを使用する必要がありますか?), 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 に答える