如何获取字符串中所有Ruby正则表达式的匹配数据?

Jos*_*gan 42 ruby regex

我需要MatchData在字符串中每次出现正则表达式.这与Regex的Match All Occurrences中建议的扫描方法不同,因为它只给我一个字符串数组(我需要完整的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)
Run Code Online (Sandbox Code Playgroud)

我怀疑有一些方法我忽略了.建议?

i-b*_*lis 66

你要

"abc12def34ghijklmno567pqrs".to_enum(:scan, /\d+/).map { Regexp.last_match }
Run Code Online (Sandbox Code Playgroud)

给你的

[#<MatchData "12">, #<MatchData "34">, #<MatchData "567">] 
Run Code Online (Sandbox Code Playgroud)

正如您所见,"技巧"是构建一个枚举器以获取每个last_match.

  • 令人难以置信的是,没有内置的方法,我们不得不诉诸这样的黑客. (3认同)

Jos*_*gan 9

我目前的解决方案是向Regexp添加each_match方法:

class Regexp
  def each_match(str)
    start = 0
    while matchdata = self.match(str, start)
      yield matchdata
      start = matchdata.end(0)
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

现在我能做到:

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

告诉我有更好的方法.

  • 为什么要附加到问题上?这是一个答案.我只是希望有更好的答案,这就是为什么我不接受我自己的答案.如果没有找到更好的答案,那么最终我会将其标记为答案. (4认同)

Ale*_*kin 7

我会把它放在这里以防万一通过相应的谷歌搜索使代码可用:

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

结果如下:

? #<MatchData "12">
? #<MatchData "34">
? #<MatchData "567">
Run Code Online (Sandbox Code Playgroud)

详细解释.