時刻情報を抽出するには、次のような文字列を考えてください。
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"
スキャンのような列挙子が必要ですが、スキャンから利用できる配列ではなく、 MatchDataオブジェクトを取得できる列挙子が必要です。
たとえば、次のように記述できます。
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">
前の質問で回答を見ましたが、それは洗練されていない解決策だと思います。そのため、回答が投稿されてからここ数年で状況が変わった場合に備えて確認してください。