input.gsub(数字){| m | p $〜}在Ruby中匹配数据中所有出现的数据

时间:2014-12-24 06:16:35

标签: ruby regex gsub

来自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

1 个答案:

答案 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 = $~

和后者一起玩。希望它有所帮助。