【问题标题】:The Ruby %r{ } expressionRuby %r{ } 表达式
【发布时间】:2012-09-12 09:06:27
【问题描述】:

模型中有一个字段

validates :image_file_name, :format => { :with => %r{\.(gif|jpg|jpeg|png)$}i

对我来说这看起来很奇怪。我知道这是一个正则表达式。但我想:

  • 了解它的确切含义。 %r{value} 等于 /value/ 吗?
  • 能够用普通的 Ruby 正则表达式运算符 /some regex/~= 替换它。有可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    %r{} 等效于 /.../ 表示法,但允许您在正则表达式中包含“/”而无需转义它们:

    %r{/home/user}
    

    相当于:

    /\/home\/user/
    

    这只是一种语法商品,为了便于阅读。

    编辑:

    请注意,您几乎可以使用任何非字母字符对来代替“{}”。 这些变体也同样有效:

    %r!/home/user!
    %r'/home/user'
    %r(/home/user)
    

    编辑 2:

    请注意,%r{}x 变体会忽略空格,从而使复杂的正则表达式更具可读性。来自GitHub's Ruby style guide的示例:

    regexp = %r{
      start         # some text
      \s            # white space char
      (group)       # first group
      (?:alt1|alt2) # some alternation
      end
    }x
    

    【讨论】:

    • 只在 1 小时前投了反对票。至于作为分隔符的空格,这很棒,但不是我推荐的那种东西,以便能够在六个月后阅读您的代码而不会感到困惑:)
    • 如果你使用空格作为你的分隔符,你的正则表达式会在你以后添加空格时中断。我认为这个想法是使用与正则表达式中的任何内容都不匹配的分隔符,大括号作为首选默认值。
    • 似乎 ruby​​ 旨在编写尽可能糟糕的代码
    • 不理解您第二次编辑的注释。 %r{}x 有什么特别之处? /.../x 也忽略空格。这不是%r 语法的特殊属性。所有可以关注/../的选项也可以关注%r{}
    【解决方案2】:

    使用%r,您可以使用任何分隔符。

    您可以使用%r{}%r[]%r!! 等。

    使用其他分隔符的好处是您不需要转义普通正则表达式中使用的/

    【讨论】:

      【解决方案3】:

      \. => 包含一个点
      (gif|jpg|jpeg|png) => 然后,这些扩展名之一
      $ => 结尾,后面没有任何内容
      i => 不区分大小写

      和写/\.(gif|jpg|jpeg|png)$/i一样。

      【讨论】:

      • %r{value} 等于 /value/ 吗?
      • 是的,是一样的。 - 例如%w[1 2 3][1, 2, 3] 相同。
      • %w[1 2 3][1, 2, 3]相同。与['1', '2', '3']相同。
      • @JörgWMittag 感谢您的纠正。
      【解决方案4】:

      此正则表达式匹配所有以 .gif、.jpg... 结尾的字符串

      你可以换成

      /\.(gif|jpg|jpeg|png)$/i
      

      【讨论】:

        【解决方案5】:

        这意味着image_file_name 必须以点结尾 ($) 和 gif、jpg、jpeg 或 png 之一。

        是的%r{}// 的含义完全相同,但在%r{} 中你不需要转义/

        【讨论】:

          猜你喜欢
          • 2012-02-21
          • 1970-01-01
          • 2015-01-15
          • 1970-01-01
          • 2011-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多