Вот несколько альтернативных способов сделать то, что вы хотите, вот как я бы это сделал:
s = "Charges for the period 2012-01-28 00:00:00 to 2012-02-27 23:59:59:<br>\nAny Network Cap remaining: $366.550<br>International Cap remaining: $0.000" # => "Charges for the period 2012-01-28 00:00:00 to 2012-02-27 23:59:59:<br>\nAny Network Cap remaining: $366.550<br>International Cap remaining: $0.000"
dt1, dt2 = /period (\S+ \S+) to (\S+ \S+):/.match(s).captures # => ["2012-01-28 00:00:00", "2012-02-27 23:59:59"]
dt1 # => "2012-01-28 00:00:00"
dt2 # => "2012-02-27 23:59:59"
Это использует «period» и «to» и трейлинг «:», чтобы пометитьначало и конец диапазона, который нужно найти, и захват непробельных символов, которые обозначают дату и время в каждой метке даты и времени.
Альтернативно, использование «named-captures» предопределяет переменные:
/period (?<dt1>\S+ \S+) to (?<dt2>\S+ \S+):/ =~ s # => 16
dt1 # => "2012-01-28 00:00:00"
dt2 # => "2012-02-27 23:59:59"
С этого момента, если вы хотите разбить возвращаемые значения, вы можете проанализировать их как даты:
require 'date'
d1 = DateTime.strptime(dt1, '%Y-%m-%d %H:%M:%S') # => #<DateTime: 2012-01-28T00:00:00+00:00 ((2455955j,0s,0n),+0s,2299161j)>
d1.month # => 1
d1.day # => 28
Или вы можете даже использовать вспомогательные снимки:
matches = /period (?<dt1>(?<date1>\S+) (?<time1>\S+)) to (?<dt2>(?<date2>\S+) (?<time2>\S+)):/.match(s)
matches # => #<MatchData "period 2012-01-28 00:00:00 to 2012-02-27 23:59:59:" dt1:"2012-01-28 00:00:00" date1:"2012-01-28" time1:"00:00:00" dt2:"2012-02-27 23:59:59" date2:"2012-02-27" time2:"23:59:59">
matches['dt1'] # => "2012-01-28 00:00:00"
matches['date1'] # => "2012-01-28"
matches['time2'] # => "23:59:59"
Все это документировано в документации Regexp .