2012-05-07 59 views
0

我想解析通過一個文件並替換一些天/日期。gsub!與Date.strptime不承認我的日期

例如, 我想改變

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') 

顯示正確的日期爲12年6月5日 和

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

您似乎試圖引用日期函數中的匹配組。這雖然不起作用。語法是只有可用,如果您替換簡單的字符串。 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函數返回的字符串。但是,你可以使用自動設置匹配的組魔術匹配變量:

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

+0

謝謝你描述它爲什麼不會工作。這很有道理。我嘗試使用$ 1,但我一直在使用$ 1 _magic_匹配變量來替代NilClass_,例如... r.gsub!(/ \ blast night \(([0-3] [0-9] \。[ 0-1] [0-9] \。[0-9] [0-9])\)/ EI,Date.strptime($ 1, 「%d。%米。%Y」)。的strftime(「%甲「).to_s +'night') –

+0

嗯,好的,'$ 1'變量只在'gsub'的塊變量中設置。我更新了我的答案。這應該現在肯定有效。有關詳細信息,請參見[文檔](http://www.ruby-doc.org/core-1.9.3/String.html#method-i-gsub)。 –

+0

大聲笑,我剛剛嘗試了什麼新的建議是在看到你更新它之前。我回到這裏來告訴你什麼工作,並看到你有我想出的。非常感謝! –