0

我正在解析一个 CSV 文件,其中包含表示持续时间的文本,它可能是小时、分钟或两者的任意组合。例如:

  1. “1小时30分钟”
  2. “2小时”
  3. “45分钟”

我希望能够做到这一点:duration = h.hours + m.minutes并确保它h是小时(如果存在)并且对于m.

我尝试用这个 regex 解决这个问题/(\d*)\s?hour\D*(\d*)\s?min/),但这不会单独检测几分钟或几个小时。

所以我把它改成了 this /(\d+)\s?\D*\s?(\d*)/,但这也是错误的,因为无法判断该值是一小时还是一分钟,所以我可以将它转换为houror minutes

我很困惑哪种方式可以在我的应用程序中解决这个问题。是正则表达式、哈希、匹配还是任何其他方式?任何帮助或建议表示赞赏。

4

3 回答 3

4

这是一种奇特的方式:

def string_to_duration(string)
  string.downcase.scan(/(\d+)\s+(hours?|minutes?)/).map do |number, unit|
    number.to_i.send(unit)
  end.reduce(:+)
end

测试:

require "active_support/all"

input = [
  "1 hour 30 minutes",
  "2 hours",
  "45 minutes"
]

def string_to_duration(string)
  string.downcase.scan(/(\d+)\s+(hours?|minutes?)/).map do |number, unit|
    number.to_i.send(unit)
  end.reduce(:+)
end

input.each do |str|
  puts string_to_duration str
end

输出:

5400
7200
2700

注意:这也将接受重复的单位,如"1 minute 1 minute 1 minute"will print 180

于 2013-06-10T11:59:35.553 回答
1

如果您知道字符串中至少存在一个,那么这与正则表达式匹配非常简单。例如:

(?:(\d+)\s*hours?)?\s*(?:(\d+)\s*minutes?)?
于 2013-06-10T11:52:57.960 回答
0

这就是我要做的,我相信这是最直接的方法:

str = "1 hour 30 minutes"
h = str[/(\d+) hour/, 1].to_i rescue 0
m = str[/(\d+) minute/, 1].to_i rescue 0
于 2013-06-11T01:36:38.387 回答