GSUB! Date.strptime无法识别我的约会

时间:2012-05-07 19:03:49

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

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

例如, 我想改变

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?关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分: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'
}

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