【问题标题】:Ruby regular expression using gsub使用 gsub 的 Ruby 正则表达式
【发布时间】:2010-02-06 08:40:02
【问题描述】:

您好,我是 Ruby 和正则表达式的新手。我正在尝试使用正则表达式从日期中删除月份或日期中的任何零,日期格式为“02/02/1980”=>“2/2/1980”

def m_d_y
  strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end

这个正则表达式有什么问题?

谢谢。

【问题讨论】:

    标签: ruby regex gsub


    【解决方案1】:
    "02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"
    

    \b 是字边界的零宽度标记,因此\b0 在零之前不能有数字。

    【讨论】:

      【解决方案2】:

      您可以简单地删除以斜线结尾的部分中的 0。

      为我工作

      require "date"
      
      class Date
          def m_d_y
            strftime('%m/%d/%Y').gsub(/0(\d)\//, "\\1/")
          end
      end
      
      puts Date.civil(1980, 1, 1).m_d_y
      puts Date.civil(1980, 10, 1).m_d_y
      puts Date.civil(1980, 1, 10).m_d_y
      puts Date.civil(1908, 1, 1).m_d_y
      puts Date.civil(1908, 10, 1).m_d_y
      puts Date.civil(1908, 1, 10).m_d_y
      

      输出

      1/1/1980
      10/1/1980
      1/10/1980
      1/1/1908
      10/1/1908
      1/10/1908
      

      【讨论】:

      • 一个小变种也能很好地工作:strftime('%m/%d/%Y').gsub(/0(\d{1})\//, "\\1/" )
      • 是的,亚历克斯。默认计数器是 {1},所以它不是必需的,除了清楚起见,“*”也等同于 {0,},“+”等同于 {1,}
      • 或者使用积极的前瞻,你可以做strftime('%m/%d/%Y').gsub(/0(\d)(?=\/)/, '\1')
      【解决方案3】:

      既然可以做到这一点,为什么还要使用正则表达式呢?

      require "date"
      
      class Date
          def m_d_y
            [mon, mday, year].join("/")
          end
      end
      

      【讨论】:

        【解决方案4】:

        试试/(?<!\d)0(\d)/

        "02/02/1980".gsub(/(?<!\d)0(\d)/,$1)
        => "2/2/1980"
        

        【讨论】:

        • 嗯?你是在哪个 Ruby 解释器上做的? AFAIK(并根据regular-expressions.info/lookaround.html)Ruby 不支持后视替换插值是通过'\1'(包括引号!)而不是$1 完成的。
        • 我不确定其他 ruby​​,但 ruby​​ 1.9 支持。
        【解决方案5】:

        问题在于它与有效日期不匹配,因此您的替换会破坏有效字符串。修复:

        正则表达式:(^|(?&lt;=/))0

        替换:''

        【讨论】:

        【解决方案6】:

        你说 Ruby 抛出了一个语法错误,所以你的问题甚至在你到达正则表达式之前就出现了。可能是因为您没有在任何事情上致电strftime。试试:

        def m_d_y
          t = Time.now
          t.strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
        end
        

        然后用实时替换 Time.now,然后调试你的正则表达式。

        【讨论】:

        • 我在 Date 类中调用 strftime :)
        • 好吧。不知道否决票来自哪里,但无论如何。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多