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,因为它可以评估没有日期的字符串...... –