2011年4月30日

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


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




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