Ruby正则表达式抛出无效的反向参考号/名称错误

问题描述:

我目前的代码旨在通过一个巨大的.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>反向引用它们来避免这种情况,但是我所有的尝试都以失败告终。有人能告诉我它应该看起来如何,或提供一个替代解决方案?

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

使用'来界定你的第二个gsub参数(替换字符串),而不是/

没有正则表达式:

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

+1为“无正则表达式”。 – 2013-03-11 21:03:30

我会去与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 

我认为值得补充的是,虽然上面的答案是正确的,但他们没有解决OP得到的错误。第二个参数是正则表达式时,此错误不是问题。事实上,在上面的例子中,ruby从未实际调用gsub方法,因为第二个参数中的正则表达式不会被解析。反斜杠后跟任何数字都会导致此错误。这是一个无效的正则表达式。