Рубиновое регулярное выражение с использованием gsub - PullRequest
2 голосов
/ 06 февраля 2010

Привет, я новичок в 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

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

Спасибо.

Ответы [ 6 ]

3 голосов
/ 06 февраля 2010
"02/02/1980".gsub(/\b0/, '') #=> "2/2/1980"

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

2 голосов
/ 06 февраля 2010

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

require "date"

class Date
    def m_d_y
      [mon, mday, year].join("/")
    end
end
2 голосов
/ 06 февраля 2010

Вы можете просто удалить 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
0 голосов
/ 06 февраля 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 реальным временем, затем отладьте свое регулярное выражение.

0 голосов
/ 06 февраля 2010

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

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

Замена: ''

0 голосов
/ 06 февраля 2010

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

"02/02/1980".gsub(/(?<!\d)0(\d)/,$1)
=> "2/2/1980"
...