Переформатировать (безумные) строки с помощью RegExp - PullRequest
0 голосов
/ 19 сентября 2010

Мое приложение извлекает информацию из API.К сожалению, их данные не очень красивые.Вот как могут выглядеть строки:

2
2: 30
10.00
2 часа ночи
15:30
22:00 по восточному времени
10:00:00 PT / EST
22:00 (по центру)
10:00, 11:00 и 12:00

Я имею в виду, что они могут быть чем угодно:)

Мне нужно, чтобы формат был 12: 00 (ЧЧ: ММ) !

Вот то, что я получил до сих пор, и это работает довольно хорошо, но я не RegExp-гуру :) Я думаю, что есть гораздо более быстрый ярлык.

(Ruby code. Gsub = Replace)

def universal_hour(time)

  #replacing & (10:00 & 18:00) and dots (10.00)
  formatted_time = time.upcase.gsub("&", ",").gsub(".", ":")

  #midnight = 00:00
  formatted_time = formatted_time.gsub("midnight", "00:00")

  #removing everything else (10:00 am PST whatever), whitespaces and tailing punctuation
  formatted_time = formatted_time.gsub(/[a-z]+|[A-Z]+|\(|\)|\s|.*:$|.*,$|.*-$/, "")

  #make these formats: 10, 2, 3:30, into: HH:MM
  formatted_time = "#{formatted_time}:00" if formatted_time.match(/^\d{2}$/)
  formatted_time = "0#{formatted_time}:00" if formatted_time.match(/^\d{1}$/)
  formatted_time = "0#{formatted_time}" if formatted_time.match(/^\d{1}:\d{2}$/)

  #Some are dates (2007-01-24)
  formatted_time = "" if formatted_time.match(/^\d{4}-\d{2}-\d{2}$/)

  #Some weird things (10/9)
  formatted_time = "" if formatted_time.match(/\//)

  #Be safe: If it's still doesn't contain a number, remove it
  formatted_time = "" unless formatted_time.match(/\d/)

  #10-30 -> 10:30
  formatted_time = formatted_time.gsub("-", ":") if formatted_time.match(/^\d+-\d{2}$/)

  #2300 -> 23:00
  if formatted_time.match(/^\d{4}$/)
    h = formatted_time[0..1]
    m = formatted_time[2..3]
    formatted_time = "#{h}:#{m}"
  end

  return formatted_time
end

Ответы [ 2 ]

3 голосов
/ 19 сентября 2010

gem install chronic и ваши проблемы решены. Смотри http://chronic.rubyforge.org/

2 голосов
/ 19 сентября 2010

Вместо использования регулярного выражения, почему бы не использовать способность Руби анализировать и форматировать время?

t = Time.parse("3:30 pm").strftime("%H:%M") # 15:30

Единственная проблема с этим состоит в том, что он выиграл 't покрыть некоторые из ваших угловых случаев (например, строки с часовыми поясами или «полночь»).Для этого вы можете использовать самоцвет для разбора времени, например Chronic .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...