通过正则表达式,拆分,tokinize或散列解析文本

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

  • “1小时30分钟”
  • “2小时”
  • “45分钟”
  • 我希望能够做到这一点: duration = h.hours + m.minutes并确保h是小时(如果存在)和m相同。

    我尝试用这个正则表达式/(d*)s?hourD*(d*)s?min/)这个问题,但是这不会单独检测分钟,或者单独检测小时。

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

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


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

    (?:(d+)s*hours?)?s*(?:(d+)s*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
    

    测试:

    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


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

    str = "1 hour 30 minutes"
    h = str[/(d+) hour/, 1].to_i rescue 0
    m = str[/(d+) minute/, 1].to_i rescue 0
    
    链接地址: http://www.djcxy.com/p/92829.html

    上一篇: Parsing text by regex, split, tokinize, or hash

    下一篇: regex to remove vowels from string except first and last charаcter