2012-05-07 4 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') 

показывает правильную дату в 06.05.12 и

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

дает мне соответствующий ответ. Почему не заменяет mydate на \ 1 работу при использовании Date.strptime? Любые предложения о том, как обойти это?

ответ

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

Обратите внимание, что я написал $1 вместо \1 в strptime аргументах

+0

Спасибо за поясняющими, почему он не будет Работа. Это имеет смысл. Я пытался использовать $ 1, но я продолжал получать _can't dup NilClass_ с переменной $ 1 _magic_ match так же, как ... r.gsub! (/ \ Blast night \ (([0-3] [0-9] \. [ 0-1] [0-9] \. [0-9] [0-9]) \)/е, Date.strptime ($ 1, "% d.% м.% г"). STRFTIME ("% А ") .to_s + 'night') –

+0

Хммм, хорошо, переменная' $ 1' задана только в блочном варианте 'gsub'. Я обновил свой ответ. Это определенно должно работать. Подробнее см. [Документацию] (http://www.ruby-doc.org/core-1.9.3/String.html#method-i-gsub). –

+0

LOL, я просто попробовал, что было вашим новым предложением, прежде чем увидеть, что вы его обновили. Я вернулся сюда, чтобы рассказать вам, что сработало, и увидел, что у вас есть именно то, что я придумал. Спасибо огромное! –

Смежные вопросы