Редактировать: @ snowe2010 указал, что мой ответ очень похож на его, который он опубликовал ранее. Это правда, и я извинился за то, что не упоминал об этом, но в свою защиту я почему-то не заметил его ответа. Однако я оставлю все, так как некоторые из моих замечаний могут быть полезны для напстердильвы, которая, вероятно, довольно нова для Руби.
Я думаю, что вам нужно сделать что-то вроде этого, чтобы извлечь дату и больше ничего:
require 'date'
dates = @arr_sh.select do |str|
begin
Date.strptime(str, '%b %d, %Y')
true
rescue ArgumentError
false
end
end
dates # => ["JAN 28, 2014", "JAN 21, 2014", "JAN 14, 2014", "JAN 7, 2014",
# "DEC 31, 2013", "DEC 24, 2013", "DEC 17, 2013"]
К сожалению, Ruby не имеет метод is_a_date?(str, '%b %d, %Y')
. Вместо этого вы просто должны позволить Date#strptime вызывать исключение, когда он задыхается. Если strptime
возвращает объект даты, то выполняется true
и возвращается к select
; else добавляется ArgumenError
, который улавливается предложением rescue, а false
возвращается в select
, а затем на следующий объект str
.
Это отклонит «Моя собака называется Diva», но она также отвергает «JAN 99, 2014» и «FEB 29, 2014», которые могут проскальзывать с помощью более простых фильтров. Он также отклонит «28 января 2014 года», что-то, чего вы не можете захотеть, но в этом случае вам, вероятно, необходимо сначала обеспечить, чтобы все даты имели общий формат.
Возможно, вы думаете, что это ужасная проблема, просто чтобы убедиться, что строка - это дата. Да, это боль, но я думаю, что что-то вроде этого ожидалось бы в производственной среде, где стоимость несанкционированного уклонения от вашего фильтра может быть очень высокой.
Возможно, вы захотите рассмотреть возможность хранения объектов даты, а не строк даты. Это позволит вам легко манипулировать и сравнивать даты.Ваша проблема здесь упростится:
dates = @arr_sh.select { |e| e.class == Date }
'@ arr_sh.uniq' будет правильно удалять дубликаты, но не будет изменять массив на месте. Используйте '@ arr_sh.uniq!', Чтобы на самом деле мутировать массив, хранящийся в '@ arr_sh'. –
Чтобы сохранить только даты в массиве. Вы можете использовать @ arr_sh.delete_if {| i | [«Оцените этот фильм», «ИНФОРМАЦИЯ О ВИДЕО», «ПОСМОТРЕТЬ ТЕПЕРЬ СЕЙЧАС»]. Включите? (I)} – vidaica
@vidaica, вы должны квалифицировать свое предложение, так как вы предполагаете, что '@ arr_sh' никогда не содержит ничего, кроме дат выраженные в виде строк и заглавных строк, которые вы хотите исключить. –