From: Tomoaki Nishiyama Date: 2011-11-10T17:19:18+09:00 Subject: [ruby-dev:44852] [ruby-trunk - Feature #5606] String#each_match(regexp) Issue #5606 has been updated by Tomoaki Nishiyama. 長い配列中のモチーフの存在位置のリストを作りたいので、位置(offset)が必要です。 String#scan ではダメかというと longstring.scan(regex) do |matchstr| m=Regexp.last_match ... puts "#{m.begin(0)}-#{m.end(0)-1} some other info" end でとれば確かにとれるらしいけど、いかにもトリッキーな気がしますので、直接的に longstring.each_match(regex) do |m| ... puts "#{m.begin(0)}-#{m.end(0)-1} some other info" end と書ける方がうれしいです。 ---------------------------------------- Feature #5606: String#each_match(regexp) http://redmine.ruby-lang.org/issues/5606 Author: Tomoaki Nishiyama Status: Open 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://redmine.ruby-lang.org