У меня есть метод, который анализирует строку в на дату, но я хочу проверить это, я не пытаюсь проанализировать не числовую строку или строку, какой преподаватель представляют формат даты или формат времени?
как может идентификатор o это?
в данный момент я имею:
if(string=~ /^\D*$/ )
{
return false
else
do something_else
}
это было хорошо для не числовой строки как "UNKNOWN"
но не работал бы на "UNKNOWN1"
какая-либо идея, что я могу использовать, чтобы удостовериться, что только дата или форматы времени анализируются?
Никакой каламбура, но информация здесь устарела (2015 г.), а некоторые методы и модули были удалены из Ruby 2.x. Я оставляю это здесь на всякий случай кто-то где-то до сих пор использует 1.8.7
Ладно, может быть там был умышленный каламбур ;-)
Вы могли бы подумать, что можете использовать Date.parse или DateTime.parse для проверки неверных дат (подробнее см. Date.parse здесь )
d = Date.parse(string) rescue nil
if d
do_something
else
return false
end
, потому что неправильные значения вызывают исключение, которое можно перехватить. Однако предлагаемые тестовые строки фактически возвращают Date с Date.parse
Например ..
~\> irb
>> Date.parse '12-UNKN/34/OWN1'
=> #<Date: 4910841/2,0,2299161>
>>
Date.parse просто недостаточно умен, чтобы выполнять эту работу: - (
ParseDate.parsedate работает лучше. Вы можете видеть, что он пытается проанализировать дату, но в тестовых примерах не находит действительный год или месяц. Подробнее здесь
>> require 'parsedate'
=> true
>> ParseDate.parsedate '2010-09-09'
=> [2010, 9, 9, nil, nil, nil, nil, nil]
>> ParseDate.parsedate 'dsadasd'
=> [nil, nil, nil, nil, nil, nil, nil, nil]
>> ParseDate.parsedate '12-UNKN/34/OWN1'
=> [nil, nil, 12, nil, nil, nil, nil, nil]
>> ParseDate.parsedate '12-UNKN/34/OWN1'
=> [nil, nil, 12, nil, nil, nil, nil, nil]
Парсеры Ruby оптимистичны, если вы можете выбросить кучу мусора и получить результат из входной строки, Date.parse и DateTime.strptime попробует это сделать.
Вам нужна пессимистическая и строгая проверка, что означает, что вместо того, чтобы предполагать принятие после попытки охоты за мусором с помощью регулярного выражения, вы должны предполагать отказ и искать сокровища с помощью регулярного выражения.
Ваша первая проверка: «Является ли строка числовой?» Использует регулярное выражение, чтобы попытаться найти строку, полностью состоящую из нечисловых символов, и отклоняет ее, если находит ее. \ D (с заглавной буквой D) ищет нечисловые символы, а входные строки будут соответствовать вашему регулярному выражению, только если оно полностью состоит из 0 или более нечисловых символов.
Вероятно, вам больше повезет со следующей логикой для числовых значений:
if(string=~ /^\d*$/ )
something_else
else
return false
end
Это соответствует строке, состоящей полностью из 0 или более числовых символов, выполняет something_else , если находит ее, и возвращает false в противном случае .
Если вы хотите явно искать время и отклонять все другие значения. Для формата ЧЧ: ММ: SSAM, который допускает пропуск начальных 0 для каждого поля, с 12-часовым временем вы можете использовать следующее:
if (string =~ /^[01]?\d:[0-5]?\d:[0-5]?\d[AP]M$/)
something_else
else
return false
end
Аналогично для дат, вы хотите явно искать действительные даты и отклонять все остальные значения.Для ММ / ДД / ГГГГ, которые допускают пропуск нулей в начале для всего поля, кроме лет, вы можете использовать:
if (string =~ /^[0-1]\d\/[0-3]?\d\/\d{4}/)
something_else
else
return false
end
Вспомогательные функции Ruby стараются быть подробными в том, что они принимают, но для проверки это бесполезная черта. Будьте строгими, предполагайте, что все недействительно, пока не будет доказано обратное, а затем примите это.
Я бы посоветовал вам составить список форматов даты и даты и времени, которые вы ожидаете и собираетесь поддерживать. Вы можете определить их, используя strftime
совместимые строки, а затем использовать те же строки при синтаксическом анализе дат, используя DateTime # strptime
. Попробуйте проанализировать входные строки с помощью каждого поддерживаемого шаблона, первый из которых не генерирует исключение, вернет проанализированную дату. Если каждый выдает исключение, строка не является допустимой датой.