这是一个疯狂的打击:
REGEX = /^([a-z]{2})(\d)-([a-z]{3})-(\d)(\d)(\d)$/i
STRINGS = %w[
KN3-MNO-418
HK5-SFO-320
KN3-MNO-419
HK5-SFO-321
]
def valid?(str)
chars1, d1, chars2, d2, d3, chksum = REGEX.match(str).captures
([d1, d2, d3].map(&:to_i).inject(:+) % 10) == chksum.to_i
end
STRINGS.each do |s|
puts valid?(s)
end
运行输出:
true
true
false
false
为了乐趣和利润,您可以将match
作业更改为:
_, d1, _, d2, d3, chksum = REGEX.match(str).captures
和/或计算:
([d1, d2, d3].inject(0) { |m, s| m += s.to_i } % 10) == chksum.to_i
现在,这肯定会让你和我一样感到困惑,所以我将把它分解:
/^([a-z]{2})(\d)-([a-z]{3})-(\d)(\d)(\d)$/i
方法:
- 从字符串的开头开始,找到“a”..“z”之间的两个字符,然后是...
- 一个数字,后跟...
- 一个连字符,后跟...
- “a”..“z”之间的三个字符,后跟另一个连字符和...
- 两个单独的数字和校验和数字。
REGEX.match(str).captures
将模式与字符串匹配。captures
从字符串中返回一个捕获值的数组。“捕获”是括号之间的模式中的部分。
- 的结果
captures
并行分配给局部变量。甜的。
([d1, d2, d3].map(&:to_i).inject(:+) % 10) == chksum.to_i
是让我们“哇哇哇!!!”的部分:
[d1, d2, d3].map(&:to_i)
将字符串数组转换为整数数组...
inject(:+)
是“将数组的所有元素加在一起”的 Ruby 魔法。...
% 10
是modulo 10
。查找 modolo,这是您的新朋友。
- 其余的你可以弄清楚。