【问题标题】:In Rails 3, how to validate string matches exactly only several strings在 Rails 3 中,如何验证字符串只匹配几个字符串
【发布时间】:2011-02-09 22:55:16
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby regex string


    【解决方案1】:

    您需要向正则表达式添加锚点。具体来说,您需要在正则表达式的开头添加\A,在结尾添加\Z\A\Z 分别表示字符串的开头和结尾)。

    但请注意优先级:由于| 的优先级较低,您要么必须在交替周围放置一个非捕获组,要么分别锚定每个单词。 IE。你必须做/\A(?:(dog)|(cat)|(bird))\Z/。执行/\A(dog)|(cat)|(bird)\Z/ 将不起作用,因为这样\A 将仅适用于dog,而\Z 仅适用于bird

    如果您使用^$ 而不是\A\Z,情况也是如此。关于那个主题,让我解释一下它们之间的区别:^$ 匹配一行的开头和结尾,而不是字符串。所以字符串“dog\ngy”仍然匹配正则表达式/^dog$/,但不匹配正则表达式/\Adog\Z/

    【讨论】:

    • 这非常有效。跟进这个问题。我的解决方案是处理此类检查的“正确”方法还是有更好的方法?
    • @Misha:实际上,没有。如果您的模式只是纯字符串的交替(即没有特殊的正则表达式操作),您应该只使用 :inclusion =&gt; %w(dog cat bird) 而不是正则表达式。
    【解决方案2】:

    您需要的正则表达式是:

     type_regex = /(^dog$)|(^cat$)|(^bird$)/
    

    Augusto 的另一个建议仍将匹配“catherine”、“doggie”。

    【讨论】:

    • 您的建议仍将匹配"dog\ngie""cat\nherine"
    【解决方案3】:

    在末尾添加 $。例如:

      type_regex = /[(dog)|(cat)|(bird)]$/
    

    (您可能需要转义 $)。并验证字符串的开始使用 ^

      type_regex = /^[(dog)|(cat)|(bird)]/
    

    所以这就是你想要的......我想:)

      type_regex = /^[(dog)|(cat)|(bird)]$/
    

    【讨论】:

    • 您显示的正则表达式匹配行首的狗、行尾的鸟或字符串中任意位置的猫。 IE。字符串“doggy”、“flying bird”和“lolcat madness”都与您的正则表达式匹配。另请注意,^$ 表示行的开头和结尾,而不是字符串。
    • upz,很好看。我会解决的
    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多