Ruby: найти дату в массиве строк - PullRequest
1 голос
/ 02 июня 2011

Я ищу в массиве строк в поисках Date:

Является ли метод, который я использую, хорошим способом сделать это? ИЛИ . , , есть ли лучшая альтернатива.

Возможно, более "красивый" способ сделать это?

    query = {'Hvaða','mánaðardagur','er','í','dag?','Það','er','02.06.2011','hví','spyrðu?'}

    def has_date(query)
        date = nil
        query.each do |q|
            begin
                date = Date.parse(q)
                query.delete(q)
                break
            rescue
            end
       end
       return date
    end

Ответы [ 4 ]

7 голосов
/ 02 июня 2011

Обратите внимание, что в Ruby мы используем квадратные скобки [] для литералов массива (фигурные скобки {} для литералов Hash).

Вот решение, которое найдет все датыв массив и вернуть их в виде строк (спасибо @steenslag):

require 'date'
arr = ['Hvaða', 'er', '02.06.2011', 'hví', '2011-01-01', '???']
dates = arr.select { |x| Date.parse(x) rescue nil }
dates # => ["02.06.2011", "2011-01-01"]
0 голосов
/ 03 июня 2011

Если вы хотите разобрать больше типов дат, используйте Хронический ... Я думаю, что это также имеет побочный эффект - не вызывает ошибок, просто возвращает ноль.

Так что если выхотите, чтобы были найдены все действительные даты:

arr = ['Hvaða', 'er', '02.06.2011', 'hví', '2011-01-01', '???']
arr.collect {|a| Chronic.parse a}.compact

Если вы хотите первое:

arr.find {|a| Chronic.parse a}

и если вы просто хотите, чтобы истина / ложь "есть ли здесь дата?"

arr.any? {|a| Chronic.parse a}
0 голосов
/ 02 июня 2011

Если вы просто хотите первое свидание и хотите быть строгим в отношении действительной даты:

arr = ['Hvaða', 'er', '02.06.2011', 'hví', '2011-01-01', '???']

date = arr.detect do |x|  ## or find
  d,m,y = x.split('.')
  Date.valid_civil?(y.to_i, m.to_i, d.to_i)
end

p date #=> "02.06.2011"

(Date.parse простителен, радостно разбирает 02.13.2011)

0 голосов
/ 02 июня 2011

Сначала вы можете попробовать проверить строку, если это допустимый формат даты, то вы можете проанализировать ее как дату:

query.each do |item|
  if item =~ /^\d{2}([-\\\/.])\d{2}\1\d{4}$/ then
    # coding
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...