来自How do I get the match data for all occurrences of a Ruby regular expression in a string?的答案:
input = "abc12def34ghijklmno567pqrs"
numbers = /\d+/
input.gsub(numbers) { |m| p $~ }
结果符合要求:
⇒ #<MatchData "12">
⇒ #<MatchData "34">
⇒ #<MatchData "567">
有人会分解回答者在input.gsub(numbers) { |m| p $~ }
中做了什么吗?
另外,我如何访问每个MatchData
?
答案 0 :(得分:3)
由于我是回答者,我会尝试解释。
$~
是Ruby predefined globals之一。它返回上一次成功模式匹配的MatchData 。也可以使用Regexp.last_match
访问它。
作为stated in the documentation,带有块的gsub
通常用于修改字符串,但在这里我们使用它在每次匹配时调用代码块的事实。阻止变量m
该匹配有一个简单的字符串,因此,无论我们是否需要整个MatchData
实例,我们都应该使用预定义的全局$~
。在上面提到的示例中,我们使用MatchData
简单地打印每个p $~
。
这里的诀窍是$~
返回最后MatchData
。所以,你需要的一切就是使用$~
变量,尽管它具有令人厌恶的外观。或者,您可以设置:
my_beauty_name_match_data_var = $~
和后者一起玩。希望它有所帮助。