通过正则表达式,拆分,tokinize或散列解析文本
我正在解析一个CSV文件,其中包含表示持续时间的文本,可能是小时,分钟或两者的任意组合。 例如:
我希望能够做到这一点: duration = h.hours + m.minutes
并确保h
是小时(如果存在)和m
相同。
我尝试用这个正则表达式/(d*)s?hourD*(d*)s?min/)
这个问题,但是这不会单独检测分钟,或者单独检测小时。
所以我把它改成了这个/(d+)s?D*s?(d*)/
,但它也是错误的,因为没有办法确定这个值是小时还是分钟,所以我可以将其转换为hour
或minutes
。
我很困惑在哪个方面可以解决我的应用程序中的这个问题。 它是正则表达式,散列,匹配还是其他方式? 任何帮助或建议表示赞赏。
如果你知道字符串中至少有一个存在,那么这很容易与正则表达式匹配。 例如:
(?:(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