如何在ruby中编写以下文本格式逻辑来验证文本字段

时间:2013-05-21 23:36:06

标签: ruby text logic

我有一个文本字段,只接受满足以下条件的文本:

以下类型的文本格式,其中'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,请帮助我:所以如何在脚本中包含这些检查并验证输入文本是否符合标准。

由于

2 个答案:

答案 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表示:
    1. 从字符串的开头开始,在“a”...“z”之间找到两个字符,然后是......
    2. 一位数字,然后是......
    3. 连字符,然后是......
    4. “a”..“z”之间的三个字符,后跟另一个连字符和......
    5. 两个单独的数字和校验和数字。
  • REGEX.match(str).captures将模式与字符串匹配。 captures返回字符串中捕获的值的数组。 “捕获”是括号内的模式中的部分。
  • captures的结果并行分配给局部变量。甜。
  • ([d1, d2, d3].map(&:to_i).inject(:+) % 10) == chksum.to_i是让我们走“wheeeee !!!”的部分:
    1. [d1, d2, d3].map(&:to_i)将字符串数组转换为整数数组...
    2. inject(:+)是Ruby魔术,用于“将数组的所有元素添加到一起。”......
    3. % 10modulo 10。查看modolo,这是你的新朋友。
    4. 你可以弄明白的其余部分。