[#47955] るびま記事募集:FiberとかSinatra/PadrinoとかBundlerとか — Makoto Kuwata <kwa@...>

桑田といいます。るびま編集部に入りました。

17 messages 2011/04/11

[#48016] 文字列を正規表現にマッチする部分と他の部分に分割 — "5.5" <5.5@...>

5.5 です。

12 messages 2011/04/28

[ruby-list:48019] Re: 文字列を正規表現にマッチする部分と他の部分に分割

From: "NARUSE, Yui" <naruse@...>
Date: 2011-04-29 13:51:53 UTC
List: ruby-list #48019
(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@airemix.jp>

In This Thread