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

Ruby on rails Ruby Regex验证xxx格式-####,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我需要在我的模型中按照以下格式验证输入证据编号 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 validates_forma

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

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

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 
验证:证据编号的格式,: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}/
=> # 
ruby-1.9.3-p125:001>“ABC-1234567”。匹配/^[A-Z A-Z]{3}-\d{3,6}$/
=>零

添加字符串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 
验证:证据编号的格式,: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}/
=> # 
ruby-1.9.3-p125:001>“ABC-1234567”。匹配/^[A-Z A-Z]{3}-\d{3,6}$/
=>零

尝试添加
^
开始和
$
结束

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

但是Use
mu的答案太短了

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

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

但是Use
mu的答案太短了

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

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

>> "wrong\nXXX-999\nanchors" =~ /^[A-Z a-z]{3}-\d{3,6}$/
=> 6
>> "wrong\nXXX-999\nanchors" =~ /\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中使用
\A
\z
而不是
^
$

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

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

没错,字符类中的空格看起来很奇怪。

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

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

>> "wrong\nXXX-999\nanchors" =~ /^[A-Z a-z]{3}-\d{3,6}$/
=> 6
>> "wrong\nXXX-999\nanchors" =~ /\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中使用
\A
\z
而不是
^
$

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

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

是的,character类中的空格看起来很奇怪。

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

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

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

puts "\n\nUSING 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/

您最好设置一些测试代码,并单独测试正则表达式(或者最好设置一个单元测试并以这种方式进行测试)

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

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

puts "\n\nUSING 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/

如果您想要最少3个字符,您可以使用
{3,}
。如果您想要最少3个字符,您可以使用
{3,}
。这种情况如何:XXXX-######,您也可以对字母使用类似的
{min,max}
。当
证据编号
错误时会发生什么
?这是因为rubular没有在双引号字符串上下文中计算样本数据,所以
\n
是一个文本
\n
,而不是一个换行符。是的,lol我意识到这有点晚了。我今天有点慢。这个案子呢:XXXX-#####,你也可以对字母使用类似的
{min,max}
。当
证据编号
错误的\nXXX-999\nanchors时会发生什么
?这是因为rubular没有在双引号字符串上下文中计算样本数据,所以
\n
是一个文本
\n
,而不是一个换行符。是的,lol我意识到这有点晚了。我今天有点慢。如果电话号码在文本区,可能是这样,但这似乎不太可能。@DaveNewton:不太可能的事情每天都发生在软件中。如果数据来自表单,则SQL注入不太可能,但我们仍然采取合理的预防措施,以防止意外数据造成混乱。如果电话号码位于文本区域,则可能,但这似乎不太可能。@DaveNewton:这种不太可能的情况每天都在软件中发生。如果数据来自表单,则不太可能进行SQL注入,但我们仍然采取合理的预防措施,防止意外数据造成混乱。