考虑这样一个字符串来提取时间信息:
str = "Sun rises at 6:23 am & sets at 5:45 pm; Moon comes up by 7:20 pm and goes down by 3:45 am"
我希望有一个像scan这样的枚举器,但它可以让我得到MatchData对象而不是可以从 scan 获得的数组。
例如,我可以写:
str.scan( /(?<time>\d:\d{2}) (?<meridiem>am|pm)/ ){ |arr| p arr }
要得到:
["6:23", "am"]
["5:45", "pm"]
["7:20", "pm"]
["3:45", "am"]
但是,我想知道是否有这样的事情:
str.match_all( /(?<time>\d:\d{2}) (?<meridiem>am|pm)/ ){ |md| p md }
要得到:
#<MatchData "6:23 am" time:"6:23" meridiem:"am">
#<MatchData "5:45 pm" time:"5:45" meridiem:"pm">
#<MatchData "7:20 pm" time:"7:20" meridiem:"pm">
#<MatchData "3:45 am" time:"3:45" meridiem:"am">
在上一个问题中看到了答案,但我觉得这是一个不雅的解决方案。因此,请检查以防在发布答案后的过去几年中情况发生了变化。