如何获得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">
详细的解释 。