我在Rails 3中创建了一个模型,如下所示:
class Foo < ActiveRecord::Base
attr_accessible :bar
type_regex = /(dog)|(cat)|(bird)/
validates :bar, :presence => true,
:format => { :with => type_regex }
end
我需要的类型完全匹配狗,猫或鸟。但是,在上面的类中,type_regex将匹配doggy,cathrine等。
如何使验证与这些字符串完全匹配?
谢谢
答案 0 :(得分:1)
您需要为正则表达式添加锚点。具体而言,您需要将\A
添加到开头,将\Z
添加到正则表达式的末尾(\A
和\Z
分别表示字符串的开头和结尾)。< / p>
但请注意优先级:由于|
的优先级较低,您必须在交替周围放置一个非捕获组,或者分别锚定每个单词。即你必须做/\A(?:(dog)|(cat)|(bird))\Z/
。执行/\A(dog)|(cat)|(bird)\Z/
将无效,因为\A
仅适用于dog
而\Z
仅适用于bird
。
如果您使用^
和$
代替\A
和\Z
,情况也是如此。在这个主题上让我解释一下这些主题之间的区别:^
和$
匹配一行的开头和结尾,而不是字符串。所以字符串“dog \ ngy”仍然匹配正则表达式/^dog$/
,但不匹配正则表达式/\Adog\Z/
。
答案 1 :(得分:0)
最后添加$。例如:
type_regex = /[(dog)|(cat)|(bird)]$/
(你可能需要逃避$)。并验证字符串使用的开始^
type_regex = /^[(dog)|(cat)|(bird)]/
所以这就是你想要的...我认为:)
type_regex = /^[(dog)|(cat)|(bird)]$/
答案 2 :(得分:0)
你需要的正则表达式是:
type_regex = /(^dog$)|(^cat$)|(^bird$)/
奥古斯托的另一个建议仍然是“凯瑟琳”,“小狗”。