使用正则表达式从字符串中提取数字

3

我有一个字符串,它以以下格式返回持续时间。

"152M0S" or "1H22M32S"

我需要将它中的小时、分钟和秒提取为数字。
我尝试使用正则表达式,如下所示。
video_duration.scan(/(\d+)?.(\d+)M(\d+)S/)

但是它没有返回预期的结果。有人知道我在这里做错了什么吗?

您还需要使H部分可选。 - HamZa
请描述您想如何使用生成的数据。如果您以正确的格式存储时间字符串,您可以使用类似于Date.format()的方法将它们直接转换为有用的字符串。 - errata
1
预期输出是什么? - karthik manchala
同意@karthikmanchala的观点。对于这两个示例中的每一个,展示您期望得到的结果。 - David
4个回答

2
"1H22M0S".scan(/\d+/)
#=> ["1", "22", "0']

1
你可以使用这个表达式:/((?<h>\d+)H)?(?<m>\d+)M(?<s>\d+)S/
"1H22M32S".match(/((?<h>\d+)H)?(?<m>\d+)M(?<s>\d+)S/)
#=> #<MatchData "1H22M32S" h:"1" m:"22" s:"32">

"152M0S".match(/((?<h>\d+)H)?(?<m>\d+)M(?<s>\d+)S/)
#=> #<MatchData "152M0S" h:nil m:"152" s:"0">

组后面的问号表示该组是可选的。要访问数据,请使用$~[:h]

如果我需要从“Rs. 650.00”中提取650.00怎么办? - rubyist

1
如果您想提取数字,可以按照以下方式进行:
"1H22M32S".match(/(?<hour>(\d+))H(?<min>(\d+))M(?<sec>(\d+))S/i).captures
# => ["1", "22", "32"]
"1H22M32S".match(/(?<hour>(\d+))H(?<min>(\d+))M(?<sec>(\d+))S/i)['min']
# => "22"
"1H22M32S".match(/(?<hour>(\d+))H(?<min>(\d+))M(?<sec>(\d+))S/i)['hour']
# => "1"

1

我会哈希化:

def hashify(str)
  str.gsub(/\d+[HMS]/).with_object({}) { |s,h| h[s[-1]] = s.to_i }
end

hashify "152M0S"    #=> {"M"=>152, "S"=>0} 
hashify "1H22M32S"  #=> {"H"=>1, "M"=>22, "S"=>32} 
hashify "32S22M11H" #=> {"S"=>32, "M"=>22, "H"=>11} 
hashify "1S"        #=> {"S"=>1} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接