簡體   English   中英

正則表達式日期格式小於運算符

[英]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

TL; DR

不要對比較操作使用正則表達式。 使用正則表達式分割要比較的值,或使用實際的解析器。

使用正則表達式提取可比對象

對於正則表達式來說,日期比較是一個非常糟糕的問題。 最多,您應該使用正則表達式提取您的月份中的幾天以進行數字比較。 例如:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM