[英]Regex date format less than operator
我正在嘗試使用正則表達式來驗證日期格式,並且我想檢查日期是否少於32。類似地,月份也少於12。我不知道如何處理。 目前,這就是我所擁有的;
^[0-1]?[0-9]{1}\-[0-3]?[0-9]{1}\-[0-9]{2,4}$
此正則表達式的格式為(m)m-(d)d-(yy)yy
不要對比較操作使用正則表達式。 使用正則表達式分割要比較的值,或使用實際的解析器。
對於正則表達式來說,日期比較是一個非常糟糕的問題。 最多,您應該使用正則表達式提取您的月份中的幾天以進行數字比較。 例如:
date = '01-01-1970'
date.split('-')[1].to_i < 32
#=> true
但是,上面的代碼不會真正告訴您給定日期是否有效 。 例如,2月30日或11月31日呢? 相反,您應嘗試解析日期以確定其有效性。
判斷給定日期是否有效的最佳方法是使用日期解析器對其進行解析,然后報告布爾結果或處理異常。 例如,您可以嘗試使用Date#parse解析日期 。
如果只需要布爾結果,則可以將有效/無效的分析強制為true或false。 例如:
require 'date'
date = '01-33-1970'
!!(Date.parse date rescue nil)
#=> false
少魔術,您需要從Date#parse中搶救ArgumentError。 例如:
require 'date'
def valid_date? date_string
true if Date.parse date_string
rescue ArgumentError => e
STDERR.puts "#{e.class}: #{e}: '#{date_string}'"
false
end
valid_date? '11-31-1970'
這會做您期望的,盡管更詳細。 例如,以上示例將異常打印為標准錯誤,然后返回false作為結果。
ArgumentError:無效日期:“ 11-31-1970”
#=>錯誤
^(?:[0-1][1-2]|[1-9])\-(?:3[0-1]|[0-2][1-9]|[1-9])\-[0-9]{2}(?:[0-9]{2})?$
應該做你想要的。 它將只允許1-12個月(1-9或01-12),1-31-31(1-9或01-31)的天以及至少2位數字(最多為四位)的年份。 在regex101上測試。
這是一個正則表達式,它可以完成您想要的操作:
^(0[1-9]|1[0-2]|[1-9])-(0[1-9]|[1-2][0-9]|3[0-1]|[1-9])-\d{2}(\d{2})?$
它匹配大於0且小於13的月份,然后是-
,然后是大於0且小於32的天,然后是-
,然后是年份(2位或4位數字)。
完整正則表達式,用於通過驗證匹配該格式的日期:
^((0?[13578]|10|12)-(([1-9])|(0[1-9])|([12])([0-9]?)|(3[01]?))-((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1}))|(0?[2469]|11)-(([1-9])|(0[1-9])|([12])([0-9]?)|(3[0]?))-((19)([2-9])(\d{1})|(20)([01])(\d{1})|([8901])(\d{1})))$
如果要確定字符串為有效日期,最好嘗試將其轉換。 如果無法轉換,則無效。
def date_valid?(date_string)
format = '%m/%d/' + (date_string.split(-).last.size == 4 ? '%Y' : '%y')
return true if Date.strptime(date_string, format)
rescue ArgumentError
return false
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.