在Rails 3中,如何验证字符串只匹配几个字符串

时间:2011-02-09 22:55:16

标签: ruby-on-rails ruby regex string

我在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等。

如何使验证与这些字符串完全匹配?

谢谢

3 个答案:

答案 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$)/

奥古斯托的另一个建议仍然是“凯瑟琳”,“小狗”。