如何获得string中所有出现的Ruby正则expression式的匹配数据?

我需要MatchData在string中出现正则expression式。 这与在正则expression式匹配中所提出的扫描方法不同,因为它只给了我一串string(我需要完整的MatchData来获取开始和结束信息等)。

 input = "abc12def34ghijklmno567pqrs" numbers = /\d+/ numbers.match input # #<MatchData "12"> (only the first match) input.scan numbers # ["12", "34", "567"] (all matches, but only the strings) 

我怀疑有一些我忽略的方法。 build议?

你要

 "abc12def34ghijklmno567pqrs".to_enum(:scan, /\d+/).map { Regexp.last_match } 

这给你

 [#<MatchData "12">, #<MatchData "34">, #<MatchData "567">] 

正如你所看到的,“诀窍”是build立一个枚举器,以获得每个last_match。

我目前的解决scheme是添加一个each_match方法到正则expression式:

 class Regexp def each_match(str) start = 0 while matchdata = self.match(str, start) yield matchdata start = matchdata.end(0) end end end 

现在我可以这样做:

 numbers.each_match input do |match| puts "Found #{match[0]} at #{match.begin(0)} until #{match.end(0)}" end 

告诉我有更好的办法。

我会把它放在这里,以防万一通过各自的谷歌search使代码可用:

 input = "abc12def34ghijklmno567pqrs" numbers = /\d+/ input.gsub(numbers) { |m| p $~ } 

结果如下所示:

 ⇒ #<MatchData "12"> ⇒ #<MatchData "34"> ⇒ #<MatchData "567"> 

详细的解释 。