使用RegEx重新格式化(疯狂)字符串

时间:2010-09-19 13:28:38

标签: ruby-on-rails regex

我的应用程序从API获取信息。不幸的是他们的数据不是很漂亮。这就是字符串的样子:

2
2:30
10.00
凌晨2点 下午3:30 晚上10点 太平洋时间/太平洋时间晚上10点 晚上10点(中环)
10:00,11:00& 12:00

我的意思是,他们几乎可以做任何事情:)

我需要格式为 12:00(HH:MM)

这是我到目前为止所做的,它的工作非常好,但我不是RegExp-guru :)我认为有更快捷的快捷方式到达那里。

(Ruby代码.Gsub =替换)

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 个答案:

答案 0 :(得分:3)

gem install chronic你的问题就解决了。见http://chronic.rubyforge.org/

答案 1 :(得分:2)

为什么不使用Ruby的parseformat时间,而不是使用正则表达式?

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

唯一的问题是它不会覆盖你的一些角落情况(比如带时区的字符串或“午夜”)。为此,您可以使用时间解析gem,例如Chronic