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/
。
使用'
来界定你的第二个gsub
参数(替换字符串),而不是/
没有正则表达式:
str = "DDMMYYYY"
p new_str = str[4..7] << str[2..3] << str[0..1]
#=> "YYYYMMDD"
+1为“无正则表达式”。 – 2013-03-11 21:03:30
我会去与Date::strptime
和Date#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方法,因为第二个参数中的正则表达式不会被解析。反斜杠后跟任何数字都会导致此错误。这是一个无效的正则表达式。
此外,请小心使用单引号字符串 - “\ 3- \ 2- \ 1”将内插到unicode字符,您将得到“\ u0003- \ u0002- \ u0001” – 2013-03-11 19:40:34
唉。我觉得很愚蠢。我花了数小时试图解决这个问题。无论如何,感谢您的帮助! – dermoth 2013-03-14 11:50:37