require 'date'
def pull_dates(str)
str.split(/[\/.]/).map { |s| Date.strptime(s, '%Y-%m-%d') rescue nil }.compact
end
pull_dates "log/archive/2016-12-21.zip"
#=> [#<Date: 2016-12-21 ((2457744j,0s,0n),+0s,2299161j)>]
pull_dates "log/2016-12-21/archive.zip"
#=> [#<Date: 2016-12-21 ((2457744j,0s,0n),+0s,2299161j)>]
pull_dates "log/2016-12-21/2016-12-22.zip"
#=> [#<Date: 2016-12-21 ((2457744j,0s,0n),+0s,2299161j)>,
# #<Date: 2016-12-22 ((2457745j,0s,0n),+0s,2299161j)>]
pull_dates "log/2016-12-21/2016-12-32.zip"
#=> [#<Date: 2016-12-21 ((2457744j,0s,0n),+0s,2299161j)>]
pull_dates "log/archive/2016A-12-21.zip"
#=> []
pull_dates "log/archive/2016/12/21.zip"
#=> []
Wenn Sie das Datum Zeichenfolge nur wollen, anstatt das Datum Objekt, das Verfahren wie folgt ändern.
def pull_dates(str)
str.split(/[\/.]/).
each_with_object([]) { |s,a|
a << s if (Date.strptime(s, '%Y-%m-%d') rescue nil)}
end
pull_dates "log/archive/2016-12-21.zip"
#=> ["2016-12-21"]
wenn der Punkt sollte immer erst in letzter kommt dann können Sie versuchen, diese '„log/Archiv/2016-12-21.zip“. split (/[\/.]/)[- 2] ' –
Ja Punkt wird immer immer kommen – Thorin
Auch ist es nicht die einfachste Lösung, ich würde immer mit einer Regex (\/(\ d {4} - \ d {2} - \ d {2}) \. zip). Der Grund ist, dass Sie es mit einer Übereinstimmung testen können, und Sie werden sicherlich feststellen, ob sich die Struktur der Zeichenfolge ändert. Ich weiß nicht, wie Nummer 2 sich verhält, aber ich würde nicht mit Nummer 3 gehen, da es Strings ohne Datumsangaben überhaupt auswerten kann ... –