我试图学习ruby并且很难弄清楚这段代码的每个部分是做什么的。具体来说,全局子记录如何确定两个连续数字是否都是这些值中的一个[13579]
以及它们如何在它们之间添加短划线(-
)?
def DashInsert(num)
num_str = num.to_s
num_str.gsub(/([13579])(?=[13579])/, '\1-')
end
答案 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
现在来查看正则表达式。
([13579])
取任何奇数并记住它(以后可以使用\1
(?=[13579])
检查下一个号码是否也是奇数,但不要接受它(它仍然保留在字符串中)'\1-'
输出第一个奇数和ab a - 到它。换句话说:
在每两个赔率数字之间加上-
。