[ruby-trunk - Feature #5606][Open] String#each_match(regexp)

Issue #5606 has been reported by Tomoaki N…


Feature #5606: String#each_match(regexp)

Author: Tomoaki N.
Status: Open
Priority: Low
Assignee:
Category:
Target version:

文字列上の正規表現に一致する場所のoffsetを順に処理できるような
イテレータが欲しかったのですが、
ざっと検索すると1996年
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1206
の昔から話はあり、

全くないという事はなくて、それなりに需要がありそうです。

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もですが、、

Issue #5606 has been updated by Yui NARUSE.

String#scan ではダメな理由を、ユースケースを添えて示す必要があると思います。

Feature #5606: String#each_match(regexp)

Author: Tomoaki N.
Status: Open
Priority: Low
Assignee:
Category:
Target version:

文字列上の正規表現に一致する場所のoffsetを順に処理できるような
イテレータが欲しかったのですが、
ざっと検索すると1996年
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1206
の昔から話はあり、

全くないという事はなくて、それなりに需要がありそうです。

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もですが、、

Issue #5606 has been updated by Tomoaki N…

長い配列中のモチーフの存在位置のリストを作りたいので、位置(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)

Author: Tomoaki N.
Status: Open
Priority: Low
Assignee:
Category:
Target version:

文字列上の正規表現に一致する場所のoffsetを順に処理できるような
イテレータが欲しかったのですが、
ざっと検索すると1996年
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1206
の昔から話はあり、

全くないという事はなくて、それなりに需要がありそうです。

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もですが、、

Issue #5606 has been updated by mame (Yusuke E.).

Status changed from Open to Feedback

遠藤です。

2011年11月10日17:19 Tomoaki N. [email protected]:

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 E. [email protected]

Feature #5606: String#each_match(regexp)

Author: tomoakin (Tomoaki N.)
Status: Feedback
Priority: Low
Assignee:
Category:
Target version:

文字列上の正規表現に一致する場所のoffsetを順に処理できるような
イテレータが欲しかったのですが、
ざっと検索すると1996年
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1206
の昔から話はあり、

全くないという事はなくて、それなりに需要がありそうです。

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もですが、、

Issue #5606 has been updated by mame (Yusuke E.).

Target version set to next minor


Feature #5606: String#each_match(regexp)

Author: tomoakin (Tomoaki N.)
Status: Feedback
Priority: Low
Assignee:
Category:
Target version: next minor

文字列上の正規表現に一致する場所のoffsetを順に処理できるような
イテレータが欲しかったのですが、
ざっと検索すると1996年
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/1206
の昔から話はあり、

全くないという事はなくて、それなりに需要がありそうです。

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もですが、、