我有一个文本字段,只接受满足以下条件的文本:
以下类型的文本格式,其中'A'可以是任何随机字母,'D'是任何数字,但最后一位是所有其他数字模10的总和。
AAD-AAA-DDD
例如:
KN3-MNO-41_, this means the last digit is: 3 + 4 + 1 = 8, so it becomes: KN3-MNO-418
HK5-SFO-32_, this means the last digit is: 5 + 3 + 2 = 10, so it becomes HK5-SFO-320
我正在学习ruby,请帮助我:所以如何在脚本中包含这些检查并验证输入文本是否符合标准。
由于
答案 0 :(得分:1)
def valid?(w)
w.match(/^[a-z][a-z]\d-[a-z][a-z][a-z]-\d\d\d$/i) and
([2,8,9].sum {|i| w[i].to_i} % 10 == w[10].to_i)
end
答案 1 :(得分:1)
这是一个疯狂的打击:
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
表示:
REGEX.match(str).captures
将模式与字符串匹配。 captures
返回字符串中捕获的值的数组。 “捕获”是括号内的模式中的部分。captures
的结果并行分配给局部变量。甜。([d1, d2, d3].map(&:to_i).inject(:+) % 10) == chksum.to_i
是让我们走“wheeeee !!!”的部分:
[d1, d2, d3].map(&:to_i)
将字符串数组转换为整数数组... inject(:+)
是Ruby魔术,用于“将数组的所有元素添加到一起。”...... % 10
是modulo 10
。查看modolo,这是你的新朋友。