Парсеры Ruby настроены оптимистично, если вы можете выбросить кучу мусора и получить результат из строки ввода, Date.parse и DateTime.strptime попытаются это сделать.
Вам нужна пессимистичная и строгая проверка, которая означает, что вместо того, чтобы предполагать принятие после попытки поиска мусора с помощью регулярного выражения, вы должны принять отказ и поиск сокровищ с помощью своего регулярного выражения.
ВашПервая проверка: «Является ли строка числовой» использует регулярное выражение, чтобы попытаться найти строку, состоящую полностью из нечисловых символов, и отклоняет ее, если находит ее.\ D (с заглавной буквой D) ищет нечисловые символы, и входные строки будут соответствовать вашему регулярному выражению только в том случае, если оно полностью состоит из 0 или более нечисловых символов.
Скорее всего, у вас получшеудачи со следующей логикой для чисел:
if(string=~ /^\d*$/ )
something_else
else
return false
end
Это соответствует строке, состоящей полностью из 0 или более числовых символов, делает нечто_else , если это находит, и возвращает ложь в противном случае.
Для случаев, когда вы хотите явно искать время и отклонить все другие значения.Для формата HH: MM: SSAM, который допускает пропуск первых 0 для каждого поля, с 12-часовым временем вы можете использовать следующее:
if (string =~ /^[01]?\d:[0-5]?\d:[0-5]?\d[AP]M$/)
something_else
else
return false
end
Аналогично для дат, которые вы хотите явно искать для дат, которые являются действительными,и отклонить все другие значения.Для MM / DD / YYYY, который допускает пропуск первых 0 для всех полей, кроме лет, вы можете использовать:
if (string =~ /^[0-1]\d\/[0-3]?\d\/\d{4}/)
something_else
else
return false
end
Функции полезности Ruby стараются быть многословными в том, что они принимают, но для проверки, которая не является полезнойчерта характера.Будьте строги, предположите, что все недействительно, пока не докажет обратное, затем примите это.