我需要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.
我目前的解决方案是向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)
告诉我有更好的方法.
我会把它放在这里以防万一通过相应的谷歌搜索使代码可用:
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)
详细解释.