这个gsub和正则表达式如何工作?

时间:2014-12-14 11:04:50

标签: ruby regex

我试图学习ruby并且很难弄清楚这段代码的每个部分是做什么的。具体来说,全局子记录如何确定两个连续数字是否都是这些值中的一个[13579]以及它们如何在它们之间添加短划线(-)?

def DashInsert(num)
  num_str = num.to_s
  num_str.gsub(/([13579])(?=[13579])/, '\1-')
end

2 个答案:

答案 0 :(得分:2)

num_str.gsub(/([13579])(?=[13579])/, '\1-')
  • ()称为捕获组,捕获与捕获组内存在的模式匹配的字符。因此,捕获组内存在的模式是[13579],它匹配给定数字集中的单个数字。相应的数字被捕获并存储在索引1中。

  • (?=[13579])肯定前瞻,断言匹配必须后跟前瞻中的模式匹配的字符或字符串。只有在满足此条件时才会进行更换。

  • \1指的是组索引1中存在的字符。

示例:

> "13".gsub(/([13579])(?=[13579])/, '\1-')
=> "1-3"

答案 1 :(得分:1)

您可以从一些随机测试开始:

def DashInsert(num)
  num_str = num.to_s
  num_str.gsub(/([13579])(?=[13579])/, '\1-')
end

10.times{
  x = rand(10000)
  puts "%6i: %6s" % [x,DashInsert(x)]
}

示例:

9633:  963-3
7774: 7-7-74
6826:   6826
7386:  7-386
2145:   2145
7806:   7806
9499:  949-9
4117: 41-1-7
4920:   4920
  14:     14

现在来查看正则表达式。

  1. ([13579])取任何奇数并记住它(以后可以使用\1
  2. (?=[13579])检查下一个号码是否也是奇数,但不要接受它(它仍然保留在字符串中)
  3. '\1-'输出第一个奇数和ab a - 到它。
  4. 换句话说: 在每两个赔率数字之间加上-