Регулярное выражение для соответствия дате - PullRequest
16 голосов
/ 12 мая 2011

Я хочу сопоставить даты в формате мм / дд / гг или мм / дд / гггг, но не следует выбирать 23/09/2010, где месяц равен 23, что недопустимо, или недопустимая дата, например 00/12/2020 или 12/00/2011.

Ответы [ 7 ]

37 голосов
/ 12 мая 2011

Лучше, чем сумасшедший огромный Regex (при условии, что это для проверки, а не сканирования):

require 'date'
def valid_date?( str, format="%m/%d/%Y" )
  Date.strptime(str,format) rescue false
end

И в качестве редакционной статьи в стороне: Eww!Почему вы используете такой ужасно сломанный формат даты?Go для ISO8601, YYYY-MM-DD, который является действующим международным стандартом, имеет последовательный порядок деталей, а также сортирует лексикографически.

25 голосов
/ 12 мая 2011

Лучше разбейте на / и протестируйте все отдельные части. Но если вы действительно хотите использовать регулярные выражения, вы можете попробовать это:

#\A(?:(?:(?:(?:0?[13578])|(1[02]))/31/(19|20)?\d\d)|(?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d)|(?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))|(?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d))\Z#

Пояснение:

\A           # start of string
 (?:         # group without capture
             # that match 31st of month 1,3,5,7,8,10,12
   (?:       # group without capture
     (?:     # group without capture
       (?:   # group without capture
         0?  # number 0 optionnal
         [13578] # one digit either 1,3,5,7 or 8
       )     # end group
       |     # alternative
       (1[02]) # 1 followed by 0 or 2
     )       # end group
     /       # slash
     31      # number 31
     /       # slash
     (19|20)? #numbers 19 or 20 optionnal
     \d\d    # 2 digits from 00 to 99 
   )         # end group
|
   (?:(?:(?:0?[13-9])|(?:1[0-2]))/(?:29|30)/(?:19|20)?\d\d)
|
   (?:0?2/29/(?:19|20)(?:(?:[02468][048])|(?:[13579][26])))
|
   (?:(?:(?:0?[1-9])|(?:1[0-2]))/(?:(?:0?[1-9])|(?:1\d)|(?:2[0-8]))/(?:19|20)?\d\d)
 )
\Z

Я объяснил первую часть, оставив остальное как упражнение.

Это соответствует одной недопустимой дате: 29.02.1900, но верно для любых других дат в период с 01.01.1900 по 12/31/2099

8 голосов
/ 12 мая 2011

Или вы просто используете Date.parse "some random date".
Вы получите ArgumentException, если он не сможет выполнить синтаксический анализ (=> Дата недействительна).

См., Например, http://santoro.tk/mirror/ruby-core/classes/Date.html#M000644

2 голосов
/ 12 мая 2011

Лучшее, что вы можете сделать с помощью регулярного выражения, это проверить формат, например, что-то вроде:

[0-1][0-9]/[0-3][0-9]/[0-9]{2}(?:[0-9]{2})?

Все, что за этим не может быть надежно сделано без какого-либо словаря дат. Срок действия даты зависит, например, от високосного года.

1 голос
/ 13 июня 2017

Для MM-DD-YYYY вы можете использовать приведенное ниже регулярное выражение. Он будет работать в течение високосных лет и будет соответствовать точным датам, только если год не превышает 2099.

(?:(09|04|06|11)(\/|-|\.)(0[1-9]|[12]\d|30)(\/|-|\.)((?:19|20)\d\d))|(?:(01|03|05|07|08|10|12)(\/|-|\.)(0[1-9]|[12]\d|3[01])(\/|-|\.)((?:19|20)\d\d))|(?:02(\/|-|\.)(?:(?:(0[1-9]|1\d|2[0-8])(\/|-|\.)((?:19|20)\d\d))|(?:(29)(\/|-|\.)((?:(?:19|20)(?:04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96))|2000))))

Оформить заказ в http://regexr.com/

0 голосов
/ 14 июня 2018

Вот код, который вы можете использовать :), попробуйте и скажите мне:

^([0-2][0-9]|(3)[0-1])(\/)(((0)[0-9])|((1)[0-2]))(\/)\d{4}$
0 голосов
/ 10 января 2018

, поэтому вы хотите, чтобы регулярное выражение совпадало с мм / дд / гг

^((0?1?1){1}|(0?1?2){1}|([0]?3|4|5|6|7|8|9))\/((0?1?2?3?1){1}|(0?1?2?(2|3|4|5|6|7|8|9|0))|(30))\/[1-90]{4}$

это регулярное выражение будет точно соответствовать желаемому в этом формате, мм / дд / гг и не будет проверять фиктивную дату, которую выможете протестировать регулярное выражение на regex101 , которое вы можете проверить на даты 12/30/2040 и 09/09/2020, и все, что вы хотите для этого формата, я думаю, что это также самое короткое регулярное выражение, которое вы можете найти для этогоформат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...