Регулярное выражение Ruby с использованием gsub

Привет, я новичок в Ruby и регулярных выражениях. Я пытаюсь использовать регулярное выражение для удаления любых нулей из месяца или дня в дате, отформатированной как "02/02/1980" => "2/2/1980"

def m_d_y
  strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end

Что не так с этим регулярным выражением?

Спасибо.


person Alex Baranosky    schedule 06.02.2010    source источник


Ответы (6)


Вы можете просто удалить 0 в частях, которые заканчиваются косой чертой.

Работает на меня

require "date"

class Date
    def m_d_y
      strftime('%m/%d/%Y').gsub(/0(\d)\//, "\\1/")
    end
end

puts Date.civil(1980, 1, 1).m_d_y
puts Date.civil(1980, 10, 1).m_d_y
puts Date.civil(1980, 1, 10).m_d_y
puts Date.civil(1908, 1, 1).m_d_y
puts Date.civil(1908, 10, 1).m_d_y
puts Date.civil(1908, 1, 10).m_d_y

выходы

1/1/1980
10/1/1980
1/10/1980
1/1/1908
10/1/1908
1/10/1908
person Vincent Robert    schedule 06.02.2010
comment
Второстепенный вариант также хорошо работает: strftime('%m/%d/%Y').gsub(/0(\d{1})\//, \\1/) - person Alex Baranosky; 06.02.2010
comment
Да, Алекс. Счетчик по умолчанию {1}, поэтому в нем нет необходимости, за исключением ясности, также * эквивалентен {0,} и + эквивалентен {1,} - person Vincent Robert; 06.02.2010
comment
Или, используя положительный прогноз, вы можете сделать strftime('%m/%d/%Y').gsub(/0(\d)(?=\/)/, '\1'). - person kejadlen; 06.02.2010

"02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"

\b является маркером нулевой ширины для границы слова, поэтому \b0 не может иметь цифру перед нулем.

person glenn jackman    schedule 06.02.2010

Зачем возиться с регулярным выражением, когда вы можете сделать это?

require "date"

class Date
    def m_d_y
      [mon, mday, year].join("/")
    end
end
person Alison R.    schedule 06.02.2010

Попробуйте /(?<!\d)0(\d)/

"02/02/1980".gsub(/(?<!\d)0(\d)/,$1)
=> "2/2/1980"
person YOU    schedule 06.02.2010
comment
Хм? На каком интерпретаторе Ruby вы это сделали? Насколько я знаю (и согласно regular-expressions.info/lookaround.html), Ruby не поддерживает просмотр назад и замена-интерполяция выполняется через '\1' (включая кавычки!) вместо $1. - person Bart Kiers; 06.02.2010
comment
Я не уверен в другом ruby, но ruby ​​1.9 поддерживает это. - person YOU; 07.02.2010

Проблема в том, что он не будет соответствовать действительным датам, поэтому ваша замена исказит действительные строки. Исправить:

Регулярное выражение: (^|(?<=/))0

Замена: ''

person Max Shawabkeh    schedule 06.02.2010
comment
Ruby не поддерживает просмотр назад. См.: regular-expressions.info/lookaround.html. - person Bart Kiers; 06.02.2010

Вы говорите, что Ruby выдает синтаксическую ошибку, поэтому ваша проблема заключается еще до того, как вы достигли регулярного выражения. Вероятно, потому что вы ни к чему не обращаетесь strftime. Пытаться:

def m_d_y
  t = Time.now
  t.strftime('%m/%d/%Y').gsub(/0?(\d{1})\/0?(\d{1})\//, $1 + "/" + $2 + "/" )
end

Затем замените Time.now реальным временем, а затем отладьте регулярное выражение.

person Ben    schedule 06.02.2010
comment
Я вызывал strftime из класса Date :) - person Alex Baranosky; 06.02.2010
comment
Ну тогда. Не уверен, откуда взялся отрицательный голос, но что угодно. - person Ben; 06.02.2010