使用 gsub 的 Ruby 正则表达式

发布于 2024-08-21 00:22:19 字数 240 浏览 5 评论 0原文

您好,我是 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

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

谢谢。

Hi I'm new to Ruby and regular expressions. I'm trying to use a regular expression to remove any zeros from the month or day in a date formatted like "02/02/1980" => "2/2/1980"

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

What is wrong with this regular expression?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

做个少女永远怀春 2024-08-28 00:22:19
"02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"

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

"02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"

\b is a zero-width marker for a word boundary, therefore \b0 cannot have a digit before the zero.

转身以后 2024-08-28 00:22:19

您可以简单地删除以斜杠结尾的部分中的 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

You can simply remove 0s in parts that ends with a slash.

Works for me

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

outputs

1/1/1980
10/1/1980
1/10/1980
1/1/1908
10/1/1908
1/10/1908
等数载,海棠开 2024-08-28 00:22:19

当你可以做到这一点时,为什么还要费心使用正则表达式呢?

require "date"

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

Why bother with regex when you can do this?

require "date"

class Date
    def m_d_y
      [mon, mday, year].join("/")
    end
end
任谁 2024-08-28 00:22:19

尝试 /(?

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

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

"02/02/1980".gsub(/(?<!\d)0(\d)/,$1)
=> "2/2/1980"
未央 2024-08-28 00:22:19

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

正则表达式:(^|(?<=/))0

替换:''

The problem is that it won't match valid dates so your replacement will mangle valid strings. To fix:

Regex: (^|(?<=/))0

Replacement: ''

傲世九天 2024-08-28 00:22:19

你说 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 替换为实际时间,然后调试您的正则表达式。

You say that Ruby is throwing a syntax error, so your problem lies before you have even reached the regexp. Probably because you aren't calling strftime on anything. Try:

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

Then replace Time.now with a real time, then debug your regexp.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文