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"
#=> []
あなただけではなく、日付オブジェクトより日付文字列を、したい場合は、次のように方法を変更します。
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"]
ドットは、常に最後に来なければならないならば、あなたはこの '「ログ/アーカイブ/ 2016-12-21.zip」をしようとします。 split(/[\/.]/)[- 2] ' –
はいドットはいつも最後に来る – Thorin
それは最も簡単な解決策ではない、私はいつも正規表現(\ /(\ d {4} - \ d {2} - \ d {2})\ .zip)。理由は、マッチでテストすることができ、文字列の構造が変更されたかどうかを確実に検出するからです。私は数字2がどのように動作するのかわかりませんが、数字のない文字列を評価することができるので、数字3は使わないでしょう... –