From: "mame (Yusuke Endoh)" Date: 2012-03-28T00:07:33+09:00 Subject: [ruby-dev:45446] [ruby-trunk - Feature #5606][Feedback] String#each_match(regexp) Issue #5606 has been updated by mame (Yusuke Endoh). Status changed from Open to Feedback 遠藤です。 2011年11月10日17:19 Tomoaki Nishiyama : > String#scan ではダメかというと > > longstring.scan(regex) do |matchstr| > m=Regexp.last_match > ... > puts "#{m.begin(0)}-#{m.end(0)-1} some other info" > end > > でとれば確かにとれるらしいけど、いかにもトリッキーな気がしますので、 $~ を使うのが普通です。 longstring.scan(regex) do ... puts "#{$~.begin(0)}-#{$~.end(0)-1} some other info" end 「いかにもトリッキー」というほどトリッキーとは思いませんが、 気持ちはわかります。しかし、String#scan と String#gsub の ブロックパラメータをそろえろ! (#546) という話に関係しなく もなく、話が進みにくいタイプの提案だと思いました。 機会を見つけてまつもとさんに直談判することをお勧めします。 いずれにせよ、ユースケースを示してください。 ところで、参照実装で offset = m.end(0) でなく offset = m.begin(0)+1 になってるのは意図的でしょうか。 -- Yusuke Endoh ---------------------------------------- Feature #5606: String#each_match(regexp) https://bugs.ruby-lang.org/issues/5606#change-25254 Author: tomoakin (Tomoaki Nishiyama) Status: Feedback Priority: Low Assignee: Category: Target version: 文字列上の正規表現に一致する場所のoffsetを順に処理できるような イテレータが欲しかったのですが、 ざっと検索すると1996年 http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1206 の昔から話はあり、 http://stackoverflow.com/questions/6804557/how-do-i-get-the-match-data-for-all-occurrences-of-a-ruby-regular-expression-in 全くないという事はなくて、それなりに需要がありそうです。 class String def each_match(pattern, offset=0) while(m = self.match(pattern, offset)) offset = m.begin(0)+1 yield m end end end いかがしょうか? 対称にはRegexp#each_matchもですが、、 -- http://bugs.ruby-lang.org/