Ruby 使用正则表达式从字符串中检索数字

Ruby 使用正则表达式从字符串中检索数字,ruby,regex,Ruby,Regex,我有一个字符串,它以下面的格式返回持续时间 "152M0S" or "1H22M32S" 我需要从中提取小时、分钟和秒作为数字 我试着像下面一样使用正则表达式 video_duration.scan(/(\d+)?.(\d+)M(\d+)S/) 但它并没有像预期的那样返回。任何人都知道我哪里出了问题。你可以使用这个表达式:/((?\d+H)?(?\d+M(?\d+S/) "1H22M32S".match(/((?<h>\d+)H)?(?<m>\d+)M(?<s&

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

"152M0S" or "1H22M32S"
我需要从中提取小时、分钟和秒作为数字

我试着像下面一样使用正则表达式

video_duration.scan(/(\d+)?.(\d+)M(\d+)S/)

但它并没有像预期的那样返回。任何人都知道我哪里出了问题。

你可以使用这个表达式:
/((?\d+H)?(?\d+M(?\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">
“1H22M32S”。匹配(/(?\d+H)?(?\d+M(?\d+S/)
#=> #
“152M0S”。匹配(/(?\d+H)?(?\d+M(?\d+S/)
#=> #

组后的问号使其成为可选。要访问数据:
$~[:h]

如果要提取数字,可以执行以下操作:

"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"
“1H22M32S”。匹配(/(?(\d+))H(?(\d+))M(?\d+)S/i。捕获
# => ["1", "22", "32"]
“1H22M32S”。匹配(/(?(\d+))H(?(\d+))M(?(\d+))S/i['min']
# => "22"
“1H22M32S”。匹配(/(?(\d+)H(?\d+)M(?\d+)S/i)[“小时”]
# => "1"

Me,我将
hashify

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} 

您还需要将
H
部分设置为可选。请描述您希望如何使用生成的数据。如果您以适当的格式存储时间字符串,您可以使用诸如Date.format()之类的方法将它们直接转换为有用的字符串。预期的输出是什么?同意@karthikmanchala。对于两个示例中的每一个,显示您期望得到的结果。如果我需要从“Rs.650.00”中提取650.00?
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}