From: "NARUSE, Yui" Date: 2011-04-29T22:51:53+09:00 Subject: [ruby-list:48019] Re: 文字列を正規表現にマッチする部分と他の部分に分割 (2011/04/28 22:58), 5.5 wrote: > 文字列 S の中で,正規表現 R にマッチする部分とそれ以外の > 部分をそれぞれ取得したいときに,どうもうまい方法が見つか > りません。 > > 以下のような String#each_segment メソッドがあると嬉しい > です。(この例は非実用的です) 一般論として、実際のユースケースを示した方が良いです。 特に新しいメソッドを提案するときには。 > そこで,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 -- NARUSE, Yui