0

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

例如,我想改变

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

4

1 回答 1

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'它不是一个有效的日期。strftimegsub 替换仅适用于您的函数返回的字符串。但是,您可以使用自动设置匹配组的魔术匹配变量:

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而不是\1strptime

于 2012-05-07T20:03:18.800 回答