Ruby Regex验证格式xxx-####



我需要在模型中按照以下格式验证输入证据编号。

XXX-### 
XXX-#### 
XXX-##### 
XXX-######
XXXX-#####

XXXX是字母,####是数字

我的模型代码中有以下内容。

validates_format_of :evidence_number, :with=> /[A-Z a-z]{3}-d{3,6}/

它只适用于小于3的数字,即适用于XXX-12,但不适用于大于6的数字,例如不适用于XXX-1234567

您应该使用A(字符串的开头)和z(字符串的结尾)锚点,而不是^(行首)和$(行尾):

validates_format_of :evidence_number, :with=> /A[A-Z a-z]{3}-d{3,6}z/

一个简单的例子可以说明区别:

>> "wrongnXXX-999nanchors" =~ /^[A-Z a-z]{3}-d{3,6}$/
=> 6
>> "wrongnXXX-999nanchors" =~ /A[A-Z a-z]{3}-d{3,6}z/
=> nil
>> "XXX-999" =~ /^[A-Z a-z]{3}-d{3,6}$/
=> 0
>> "XXX-999" =~ /A[A-Z a-z]{3}-d{3,6}z/
=> 0

您几乎总是希望在Ruby中使用Az,而不是^$

如果连字符后需要"至少三位数字",则需要:

/A[A-z a-z]{3}-d{3,}z/

Kenny Grant是对的,角色类中的空格看起来很奇怪。

尝试添加以开头的^和以结尾的$

validates_format_of :evidence_number, :with=> /^[A-Za-z]{3,4}-d{3,6}$/

使用mu is too short的答案。

您可能最好设置一些测试代码,并单独测试regex(或者理想情况下设置一个单元测试并以这种方式进行测试)。

invalid   = %w[777-2345 ABCD-12 ABCD-12345678 AB-12345678 ABC-1234567]
valid     = %w[ABC-12345 ABCD-123 ABCD-1234 ABCD-12345 ABCD-123456]
def validate codes,regex
  codes.each do |code|
  if code =~ regex
     puts "Valid code #{code}" 
   else
     puts "Invalid code #{code}"
   end
 end
end

使用正则表达式测试上述内容时,会出现一些问题。根据您的描述,我不明白为什么您的regex包含一个空格作为允许的字符——对于代码来说,这似乎不太可能是有效的代码。所以你可能会更好地使用这样的东西:

/A[A-Za-z]{3,4}-d{3,6}z/

它将匹配限制为一个完整字符串,并将第一个匹配限制为3或4个字母字符,将最后一个匹配限制在3-6个数字。这是假设####在您的示例中不是错误:

puts "nnUSING NEW REGEX"
puts "Validating valid codes"
validate valid,/A[A-Za-z]{3,4}-d{3,6}z/
puts "nValidating INVALID codes"
validate invalid,/A[A-Za-z]{3,4}-d{3,6}z/

添加字符串regex字符的开头和结尾:

validates_format_of :evidence_number, :with=> /^[A-Z a-z]{3}-d{3,6}$/
ruby-1.9.3-p125 :000 > "ABC-1234567".match /[A-Z a-z]{3}-d{3,6}/
 => #<MatchData "ABC-123456"> 
ruby-1.9.3-p125 :001 > "ABC-1234567".match /^[A-Z a-z]{3}-d{3,6}$/
 => nil 

最新更新