【问题标题】:Parsing text by regex, split, tokinize, or hash通过 regex、split、tokinize 或 hash 解析文本
【发布时间】:2013-06-11 09:36:38
【问题描述】:

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

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

我希望能够做到这一点:duration = h.hours + m.minutes 并确保 h 是小时(如果存在)和 m 相同。

我尝试使用此正则表达式 /(\d*)\s?hour\D*(\d*)\s?min/) 解决此问题,但这不会单独检测分钟或小时。

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

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

【问题讨论】:

  • 你想用这些输入生成什么确切的输出?
  • 我想转换成秒,例如duration = h.hours + m.minutes

标签: ruby regex parsing


【解决方案1】:

这是一种奇特的方式:

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" 将打印 180

【讨论】:

  • 我不知道任何红宝石,但我很好奇,这是如何工作的?什么将数字乘以正确的秒数? .send(unit) 是做什么的?
  • @Qtax,从你的个人资料中,我看到你确实了解 JS,所以a.send(unit) == a[unit]()。让我知道这是否可以解释!
  • @Qtax Numeric#hoursNumeric#minutes 是 Rails 中 ActiveSupport 引入的辅助方法,它计算小时/分钟到秒的数字。 a.send('hours')a.hours 相同
【解决方案2】:

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

(?:(\d+)\s*hours?)?\s*(?:(\d+)\s*minutes?)?

【讨论】:

  • 是的,但我怎么知道哪个是分钟,哪个是小时?所以我知道如何正确转换?类似于:duration = h.hours + m.minutes
  • @Mawaheb,小时总是在第一个捕获组中,分钟总是在第二个。
  • 括号中的结果被捕获到$1 -> $9
  • @Qtax 你能解释一下你的正则表达式吗?这真的会帮助我很好地理解它并理解它是如何工作的..提前感谢
  • @Qtax 真是一个不错的网站!我一直在使用rubular.com,但我想从现在开始,我会使用你建议的那个!谢谢。
【解决方案3】:

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

str = "1 hour 30 minutes"
h = str[/(\d+) hour/, 1].to_i rescue 0
m = str[/(\d+) minute/, 1].to_i rescue 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    相关资源
    最近更新 更多