【问题标题】:input.gsub(numbers) { |m| p $~ } Matching data in Ruby for all occurrences in a stringinput.gsub(数字) { |m| p $~ } 在 Ruby 中匹配字符串中所有出现的数据
【发布时间】:2015-02-22 07:20:22
【问题描述】:

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 $~ } 中所做的事情吗?

另外,我如何访问每个MatchDatas?

【问题讨论】:

  • 你想解释一下吗?

标签: ruby regex gsub


【解决方案1】:

由于我是回答者,我会尽力解释。

$~Ruby predefined globals 之一。它返回上一次成功模式匹配的 MatchData。也可以使用Regexp.last_match 访问它。

stated in the documentationgsub with block 常用于修改字符串,但这里我们使用它在每次匹配时调用代码块的事实。块变量m有一个简单的字符串来匹配,所以无论我们需要整个MatchData实例,我们都应该使用预定义的全局$~。在上面提到的示例中,我们简单地打印每个MatchDatap $~

这里的诀窍是$~ 返回最后一个MatchData。因此,您需要做的就是使用 $~ 变量,尽管它看起来很恶心。或者,您可以设置:

my_beauty_name_match_data_var = $~

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

【讨论】:

  • 另外,您可以使用预定义变量$&amp; 来获取匹配的字符串并且不传递任何内容来阻止(我的意思是代替m
  • 谢谢!你能这么快就找到我关于你的代码的问题真是太棒了!您会从此处的答案(stackoverflow.com/questions/6804557/…)链接到您的解释吗?
  • 很高兴为您提供帮助。已链接。
猜你喜欢
  • 2012-07-18
  • 2011-10-11
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
相关资源
最近更新 更多