From: "5.5" <5.5@...> Date: 2011-04-30T12:58:22+09:00 Subject: [ruby-list:48021] Re: 文字列を正規表現にマッチする部分と他の部分に分割 5.5 です。 成瀬さん,ありがとうございます。 (11/04/29 22:51), NARUSE, Yui wrote: > 一般論として、実際のユースケースを示した方が良いです。 > 特に新しいメソッドを提案するときには。 そうでしたね。 過去にやったことのなかから,簡潔にして説得力のあるユースケース を作ることができるか,考えてみます。(すぐにはできないかも) >> そこで,strscan を使う方法を考えました。 >> >> s=StringScanner.new("ab12cd") >> >> result="" >> while offset=s.exist?(/\d+/) >> len=offset-s.matched.size >> result<< s.peek(len).upcase unless len.zero? >> result<< "<#{s.matched}>" >> s.pos=s.pos+offset >> end >> result<< s.rest.upcase unless s.rest.empty? >> >> これ以上簡潔な書き方が思いつきませんでした。 >> マッチ文字列の間を取り出す手段が無いからです。 >> >> いかにも回りくどいですし,非マッチ文字列に対する処理が >> 二箇所に書かれていて DRY ではありません。 > > 以下のような感じでいいんじゃないですかね > > require'strscan' > ss = StringScanner.new("abc;def!ghi.jkl:") > while r = ss.scan_until(/[;!.:]/) > p ss.matched > p r[0...-ss.matched_size] > end このスクリプトではテキストの末尾が非マッチ文字列のときの処理が抜 けていますが,やり方は分かりました。 このほうが簡潔ですね。 StringScanner 自身が r[0...-ss.matched_size] にあたるメソッドを提 供してくれればいいと思うのですが。 -- 5.5@moji.gr.jp