2013-03-11 56 views
0

我目前的代碼旨在通過一個巨大的.csv文件,並將某些日期格式化爲適用於SQL Datetime的格式。目前,他們DDMMYYYY,我希望他們爲YYYYMMDD,這是我採取的辦法(從不同的SO問題解除):Ruby正則表達式拋出無效的反向參考號/名稱錯誤

CSV.foreach('file.csv') do |x| 
if x[0] == "1" 
    x.gsub(/([0-9]{2})-+([0-9]{2})-+([0-9]{4})/,/\3-\2-\1/) 

else 
end 

這引發錯誤「無效backref編號/名稱」。

文檔告訴我,我可以通過將?<name>定義爲組並用\k<name>反向引用它們來避免這種情況,但是我所有的嘗試都以失敗告終。有人能告訴我它應該看起來如何,或提供一個替代解決方案?

回答

3

gsub的第二個參數應該是一個字符串,而不是正則表達式(請參見docs)。

做:

x.gsub(/([0-9]{2})-+([0-9]{2})-+([0-9]{4})/,'\3-\2-\1') 

注意,第二個參數使用'replacement string'而不是/replacement string/

+2

此外,請小心使用單引號字符串 - 「\ 3- \ 2- \ 1」將內插到unicode字符,您將得到「\ u0003- \ u0002- \ u0001」 – 2013-03-11 19:40:34

+0

唉。我覺得很愚蠢。我花了數小時試圖解決這個問題。無論如何,感謝您的幫助! – dermoth 2013-03-14 11:50:37

0

使用'來界定你的第二個gsub參數(替換字符串),而不是/

5

沒有正則表達式:

str = "DDMMYYYY" 
p new_str = str[4..7] << str[2..3] << str[0..1] 
#=> "YYYYMMDD" 
+0

+1爲「無正則表達式」。 – 2013-03-11 21:03:30

0

我會去與Date::strptimeDate#strftime

dates = %w[12122012 10121012 12032013] 
#=> ["12122012", "10121012", "12032013"] 

dates.each do |date_str| 
    date = Date.strptime(date_str, '%d%m%Y') 
    puts date.strftime('%Y %m %d') 
end 

# 2012 12 12 
# 1012 12 10 
# 2013 03 12 
1

我認爲值得補充的是,雖然上面的答案是正確的,但他們沒有解決OP得到的錯誤。第二個參數是正則表達式時,此錯誤不是問題。事實上,在上面的例子中,ruby從未實際調用gsub方法,因爲第二個參數中的正則表達式不會被解析。反斜槓後跟任何數字都會導致此錯誤。這是一個無效的正則表達式。