Ruby regexp抛出无效的backref数字/名称错误

时间:2013-03-11 19:32:38

标签: ruby regex

我当前的代码旨在通过一个巨大的.csv文件,并将某些日期重新格式化为SQL Datetime友好格式。它们目前是DDMMYYYY,我希望它们是YYYYMMDD,这就是我采用的方法(取决于不同的SO问题):

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

这会引发错误“无效的反馈编号/名称”。

文档告诉我,我可以通过使用?<name>定义组并使用\k<name>反向引用它来避免这种情况,但我尝试这样做的所有尝试都以失败告终。有人可以告诉我它应该如何看待,或者提供替代解决方案吗?

5 个答案:

答案 0 :(得分:5)

没有正则表达式:

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

答案 1 :(得分:4)

gsub的第二个参数应该是字符串,而不是正则表达式(参见docs)。

执行:

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

请注意,第二个参数使用'replacement string'而不是/replacement string/

答案 2 :(得分:2)

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

答案 3 :(得分:0)

使用'分隔您的第二个gsub参数(替换字符串),而不是/

答案 4 :(得分: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