2011年4月29日

[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 <naruse@xxxxx>


投稿者 xml-rpc : 2011年4月29日 22:51
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103431
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。