【问题标题】:gsub! with Date.strptime not recognizing my dategsub! Date.strptime 无法识别我的日期
【发布时间】:2012-05-07 19:03:49
【问题描述】:

我正在尝试解析文件并替换一些日期/日期。

例如, 我要改变

In a post on the band's blog last night (06.05.12) 
to 
In a post on the band's blog sunday night

我正在尝试使用 gsub!这样做。

r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei,Date.strptime('\1',"%d.%m.%y").strftime("%A").to_s + ' night')

总是说无效日期,但是

r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei,'\1')

显示正确的日期为 06.05.12 和

mydate = '06.05.12'
r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei,Date.strptime(mydate,"%d.%m.%y").strftime("%A").to_s + ' night')

给我适当的回应。为什么在使用 Date.strptime 时用 \1 替换 mydate 不起作用?关于如何解决这个问题的任何建议?

【问题讨论】:

    标签: ruby-on-rails-3 date gsub


    【解决方案1】:

    您似乎试图在日期函数中引用匹配组。但这不起作用。如果您替换简单字符串,则该语法可用。 gsub 函数替换传递的字符串中的所有引用,但仅当它实际传递给函数时。你的代码相当于

    replacement = Date.strptime('\1',"%d.%m.%y").strftime("%A").to_s + ' night'
    r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei, replacement)
    

    “替换”因此无法工作,因为'\1' 不是有效日期。 gsub 替换仅适用于 strftime 函数返回的字符串。但是,您可以使用自动设置匹配组的 magic 匹配变量:

    r.gsub!(/\blast night \(([0-3][0-9]\.[0-1][0-9]\.[0-9][0-9])\)/ei) {
      Date.strptime($1,"%d.%m.%y").strftime("%A").to_s + ' night'
    }
    

    请注意,我在 strptime 参数中写了 $1 而不是 \1

    【讨论】:

    • 感谢您描述它为什么不起作用。这很有意义。我尝试使用 $1,但我不断得到 can't dup NilClass 与 $1 magic 匹配变量像这样... r.gsub!(/\blast night (( [0-3][0-9]\.[0-1][0-9]\.[0-9][0-9]))/ei,Date.strptime($1,"%d.% m.%y").strftime("%A").to_s + 'night')
    • 嗯,好吧,$1 变量仅设置在 gsub 的块变体中。我更新了我的答案。这现在肯定可以工作。详情请见the documentation
    • 大声笑,在看到您更新之前,我刚刚尝试了您的新建议。我回来告诉你什么是有效的,并且看到你有我想出的东西。非常感谢!
    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-25
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多