読者です 読者をやめる 読者になる 読者になる

ruby-list

本質的に正則言語の処理なので、あんまり簡単には書けないでしょう。使えるツール正規表現かRaccくらいだと思います。

個人的には、状態遷移図を描いて有限状態オートマトンをプログラムするのが良いと思います。

def parse(lines)
  p = 0
  stat = 0
  
  while true
    p = p+1
    if p >= lines.length then return end
    
    l = lines[p]
    
    case stat
    when 0
      if l = "Title1"
        stat = 1
      end
    when 1
      if l = "Title2"
        stat = 2
      end
    when 2
      if l = "Title3"
        stat = 0
      else
        puts l
      end
    end
  end
end

stateパターンを使えばもっときれいに書けるでしょうし、状態遷移図からプログラムを生成するようにすれば*1メンテナンスも比較的容易でしょう。

これなら、スタックが必要になっても書き足せば良いだけなので、正規表現を利用するより拡張が楽だと思います。(正規表現でいけると思ったら、実はスタックが必要だった、なんてことがあったりなかったりしますし)

ま、YAGNIを唱えるなら、正規表現でしょうけど。

*1:あるいは逆