Regex для проверки формата даты дд / мм / гггг

Мне нужно проверить строку даты для формата dd/mm/yyyy с регулярным выражением.

Это регулярное выражение проверяет dd/mm/yyyy, но не недействительные даты, такие как 31/02/4500:

^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$

Что такое правильное регулярное выражение для проверки dd/mm/yyyy формат с поддержкой високосного года?

28 ответов

Решение

Вставленное вами регулярное выражение не проверяет правильность високосных лет, но есть в том же посте. Я изменил это, чтобы взять dd/mm/yyyy,dd-mm-yyyy или же dd.mm.yyyy

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

Я проверил это немного в ссылке, которую Арун предоставил в своем ответе, а также здесь, и это, кажется, работает.

Я расширил регулярное выражение, данное @Ofir Luzon для форматов dd-mmm-YYYY, dd/mmm/YYYY, dd.mmm.YYYY в соответствии с моим требованием. Любой другой с таким же требованием может отослать это

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

и протестировано для некоторых тестовых случаев здесь http://regexr.com/39tr1.

Для лучшего понимания этого регулярного выражения обратитесь к этому изображению:

Обратите внимание:

Ваше регулярное выражение не работает годами, которые "кратны 4 и 100, но не 400". Годы, прошедшие этот тест, не являются високосными. Например: 1900, 2100, 2200, 2300, 2500 и т. Д. Другими словами, все годы с форматом \d\d00 помещаются в один и тот же класс високосных лет, что неверно. - MuchToLearn

Так что это работает правильно только для [1901 - 2099] (Уфф)

дд / мм / гггг:

Проверяет, если високосный год. Годы с 1900 по 9999 действительны. Только дд / мм / гггг

(^(((0[1-9]|1[0-9]|2[0-8])[\/](0[1-9]|1[012]))|((29|30|31)[\/](0[13578]|1[02]))|((29|30)[\/](0[4,6,9]|11)))[\/](19|[2-9][0-9])\d\d$)|(^29[\/]02[\/](19|[2-9][0-9])(00|04|08|12|16|20|24|28|32|36|40|44|48|52|56|60|64|68|72|76|80|84|88|92|96)$)

Попробуй это.

^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$

Вы можете легко проверить регулярное выражение на http://www.regular-expressions.info/javascriptexample.html.

Для тех, кто смотрит на это и полностью запутался, вот выдержка из моего сценария. К сожалению, все, что он делает, - это сопоставляет действительные числа при вводе даты и времени, и 31 февраля будет помечено как действительное, но, как многие говорили, регулярное выражение действительно не лучший инструмент для проведения этого теста.

Чтобы соответствовать дате в формате "гггг-мм-дд чч: мм" (или в любом порядке, пожалуйста)

var dateerrors = false;
var yearReg = '(201[4-9]|202[0-9])';            ///< Allows a number between 2014 and 2029
var monthReg = '(0[1-9]|1[0-2])';               ///< Allows a number between 00 and 12
var dayReg = '(0[1-9]|1[0-9]|2[0-9]|3[0-1])';   ///< Allows a number between 00 and 31
var hourReg = '([0-1][0-9]|2[0-3])';            ///< Allows a number between 00 and 24
var minReg = '([0-5][0-9])';                    ///< Allows a number between 00 and 59
var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');
$('input').filter(function () {return this.id.match(/myhtml_element_with_id_\d+_datetime/);}).each(function (e) {
    if (e > 0) {
        // Don't test the first input. This will use the default
        var val = $(this).val();
        if (val && !val.trim().match(reg)) {
            dateerrors = true;
            return false;
        }
    }
});
if (dateerrors) {
    alert('You must enter a validate date in the format "yyyy-mm-dd HH:MM", e.g. 2019-12-31 19:30');
    return false;
}

Приведенный выше скрипт начинается с создания объекта регулярного выражения. Затем он находит все входные данные, чьи идентификаторы соответствуют определенному шаблону, и затем просматривает их. Я не проверяю первый ввод, который я нахожу (if (e > 0)).

Немного объяснения:

var reg = new RegExp('^' + yearReg + '-' + monthReg + '-' + dayReg + ' ' + hourReg + ':' + minReg + '$', 'g');

^ означает начало матча, тогда как $ означает конец матча.

return this.id.match(/myhtml_element_with_id_\d+_datetime/);

\d+ означает совпадение с одной или последовательной последовательностью целых чисел, так myhtml_element_with_id_56_datetime а также myhtml_element_with_id_2_datetime будет соответствовать, но myhtml_element_with_id_5a_datetime не буду

Я подозреваю, что следующее настолько точно, насколько можно ожидать, не зная, когда языковой стандарт пользователя переключился с юлианского на григорианский календарь.

Он принимает либо "-", "/", либо ничего в качестве разделителей между годом, месяцем и днем, независимо от порядка.

ММДДГГГГ:

^(((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))[-/]?[0-9]{4}|02[-/]?29[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$

DDMMYYYY:

^(((0[1-9]|[12][0-9]|30)[-/]?(0[13-9]|1[012])|31[-/]?(0[13578]|1[02])|(0[1-9]|1[0-9]|2[0-8])[-/]?02)[-/]?[0-9]{4}|29[-/]?02[-/]?([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00))$

YYyyMmDd:

^([0-9]{4}[-/]?((0[13-9]|1[012])[-/]?(0[1-9]|[12][0-9]|30)|(0[13578]|1[02])[-/]?31|02[-/]?(0[1-9]|1[0-9]|2[0-8]))|([0-9]{2}(([2468][048]|[02468][48])|[13579][26])|([13579][26]|[02468][048]|0[0-9]|1[0-6])00)[-/]?02[-/]?29)$

Кроме порядка, все они соответствуют юлианскому календарю (високосный год каждые четыре года) до 1700 года, когда григорианский календарь отличается от юлианского. У него есть две проблемы:

  1. Он принимает год 0000, которого нет во многих, но не во всех стандартах. Обратите внимание, что ISO 8601 принимает год 0000 (эквивалент 1 BCE).
  2. Это не пропускает 10-13 дней, которые были потеряны, когда вступил в силу григорианский календарь. Это зависит от местности, хотя. Например, Римско-католическая церковь пропустила 10 дней, с 5 октября по 14 октября 1582 года, но Греция (последняя сменила) пропустила 16 февраля по 28 октября 1923 года, 13 дней, с учетом високосных годов 1700 года, 1800 и 1900.

Это было проверено в реализации календаря Java с 0001 года по 9999 год, с единственным расхождением - 10 дней в 1582 году.

      year  = ((20[012]\d|19\d\d)|(1\d|2[0123])) 
month = ((0[0-9])|(1[012]))
day   = ((0[1-9])|([12][0-9])|(3[01]))

year-month-day = (((20[012]\d|19\d\d)|(1\d|2[0123]))-((0[0-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01])))
day-month-year = (((0[1-9])|([12][0-9])|(3[01]))-((0[0-9])|(1[012]))-((20[012]\d|19\d\d)|(1\d|2[0123])))
year/month/day = (((20[012]\d|19\d\d)|(1\d|2[0123]))\/((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01])))
month/day/year = (((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))
day/month/year = (((0[1-9])|([12][0-9])|(3[01]))\/((0[0-9])|(1[012]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))
day.month.year = (((0[1-9])|([12][0-9])|(3[01]))\.((0[0-9])|(1[012]))\.((20[012]\d|19\d\d)|(1\d|2[0123])))
year.month.day = (((20[012]\d|19\d\d)|(1\d|2[0123]))\.((0[0-9])|(1[012]))\.((0[1-9])|([12][0-9])|(3[01])))


all = (((20[012]\d|19\d\d)|(1\d|2[0123]))-((0[0-9])|(1[012]))-((0[1-9])|([12][0-9])|(3[01])))|(((0[1-9])|([12][0-9])|(3[01]))-((0[0-9])|(1[012]))-((20[012]\d|19\d\d)|(1\d|2[0123])))|(((20[012]\d|19\d\d)|(1\d|2[0123]))\/((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01])))|(((0[0-9])|(1[012]))\/((0[1-9])|([12][0-9])|(3[01]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))|(((0[1-9])|([12][0-9])|(3[01]))\/((0[0-9])|(1[012]))\/((20[012]\d|19\d\d)|(1\d|2[0123])))|(((0[1-9])|([12][0-9])|(3[01]))\.((0[0-9])|(1[012]))\.((20[012]\d|19\d\d)|(1\d|2[0123])))|(((20[012]\d|19\d\d)|(1\d|2[0123]))\.((0[0-9])|(1[012]))\.((0[1-9])|([12][0-9])|(3[01])))

его работа для

      yyyy-mm-dd
dd-mm-yyyy
yyyy/mm/dd
mm/dd/yyyy
dd/mm/yyyy
dd.mm.yyyy
yyyy.mm.dd

yy-mm-dd
dd-mm-yy
yyyy/mm/dd
mm/dd/yy
dd/mm/yy
dd.mm.yy
yy.mm.dd

а не работать где день = dили месяц = m, пример

все примеры - введите здесь описание ссылки

Вот еще одна версия регулярного выражения, которая соответствует любому из следующих форматов даты и позволяет опускать начальные нули:

Regex: ^[0-3]?[0-9].[0-3]?[0-9].(?:[0-9]{2})?[0-9]{2}$

Матчи:

1/1/11 or 1.1.11 or 1-1-11 : true 01/01/11 or 01.01.11 or 01-01-11 : true 01/01/2011 or 01.01.2011 or 01-01-2011 : true 01/1/2011 or 01.1.2011 or 01-1-2011 : true 1/11/2011 or 1.11.2011 or 1-11-2011 : true 1/11/11 or 1.11.11 or 1-11-11 : true 11/1/11 or 11.1.11 or 11-1-11 : true

Визуализация регулярных выражений

Debuggex Demo

Здесь я написал один для dd/mm/yyyy где разделитель может быть одним из -.,/ диапазон лет 0000-9999,

Он имеет дело с високосными годами и предназначен для регулярных выражений, которые поддерживают прогнозирование, захват групп и обратных ссылок. НЕ подходит для таких как d/m/yyyy, При необходимости добавьте дополнительные разделители в [-.,/]

^(?=\d{2}([-.,\/])\d{2}\1\d{4}$)(?:0[1-9]|1\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\d{4}$

Тест на регулярное выражение101; как строка Java:

"^(?=\\d{2}([-.,\\/])\\d{2}\\1\\d{4}$)(?:0[1-9]|1\\d|[2][0-8]|29(?!.02.(?!(?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\\d{2}(?:[02468][048]|[13579][26])))|30(?!.02)|31(?=.(?:0[13578]|10|12))).(?:0[1-9]|1[012]).\\d{4}$"

пояснил:

(?x) # modifier x: free spacing mode (for comments)
     # verify date dd/mm/yyyy; possible separators: -.,/
     # valid year range: 0000-9999

^    # start anchor

# precheck xx-xx-xxxx,... add new separators here
(?=\d{2}([-.,\/])\d{2}\1\d{4}$)

(?:  # day-check: non caturing group

  # days 01-28
  0[1-9]|1\d|[2][0-8]| 

  # february 29d check for leap year: all 4y / 00 years: only each 400
  # 0400,0800,1200,1600,2000,...
  29
  (?!.02. # not if feb: if not ...
    (?!
      # 00 years: exclude !0 %400 years
      (?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)

      # 00,04,08,12,... 
      \d{2}(?:[02468][048]|[13579][26])
    )
  )|

  # d30 negative lookahead: february cannot have 30 days
  30(?!.02)|

  # d31 positive lookahead: month up to 31 days
  31(?=.(?:0[13578]|10|12))

) # eof day-check

# month 01-12
.(?:0[1-9]|1[012])

# year 0000-9999
.\d{4}

$ # end anchor

Также см. SO Regex FAQ; Пожалуйста, дайте мне знать, если это не удастся.

Нашел этот рег экс здесь

^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d{2}))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$

Это подтверждает формат mm/dd/yyyy и действительные даты правильно (но не m/d/yyyy).

Некоторые тесты

"^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.]((19|20)\\d\\d)$"

подтвердит любую дату между 1900-2099

Следующее выражение приятно и легко манипулировать:

((((0[13578]|1[02])(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)(\/|-|.)(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)((\/|-|.)(0[1-9]|1[0-9]|2[0-8]))))(\/|-|.)(19([6-9][0-9])|20(0[0-9]|1[0-4])))|((02)(\/|-|.)(29)(\/|-|.)(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26])))

Он проверяется в соответствии с форматом MM/dd/YYYY и допускает поддержку високосного года с 1960 по 2016 год. Если вам нужна расширенная поддержка високосного года, вам нужно только манипулировать этой частью выражения:

(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]))

Надеюсь, это вам очень помогло

Другой ответ, который проверяет день (dd) в зависимости от месяца (мм) и года (гггг) (т. Е. Также проверяет 29 февраля в високосные годы) и допускает годы в диапазоне от 0001 до 9999 (0000 в недействительном году по григорианскому языку). календарь)

^(?:(?:(?:0[1-9]|[12]\d|3[01])/(?:0[13578]|1[02])|(?:0[1-9]|[12]\d|30)/(?:0[469]|11)|(?:0[1-9]|1\d|2[0-8])/02)/(?!0000)\d{4}|(?:(?:0[1-9]|[12]\d)/02/(?:(?!0000)(?:[02468][048]|[13579][26])00|(?!..00)\d{2}(?:[02468][048]|[13579][26]))))$

Далее расширено регулярное выражение, данное @AlokChaudhary, для поддержки:

1. (в дополнение к,,).

2. ммм в формате ЗАГЛАВНЫМИ БУКВАМИ (в дополнение к формату заголовка)

например 30 Apr 2026 или же 24 DEC 2028 популярны.

Расширенное регулярное выражение:

      (^(?:(?:(?:31(?:(?:([-.\/])(?:0?[13578]|1[02])\1)|(?:([-.\/ ])(?:Jan|JAN|Mar|MAR|May|MAY|Jul|JUL|Aug|AUG|Oct|OCT|Dec|DEC)\2)))|(?:(?:29|30)(?:(?:([-.\/])(?:0?[13-9]|1[0-2])\3)|(?:([-.\/ ])(?:Jan|JAN|Mar|MAR|Apr|APR|May|MAY|Jun|JUN|Jul|JUL|Aug|AUG|Sep|SEP|Oct|OCT|Nov|NOV|Dec|DEC)\4))))(?:(?:1[6-9]|[2-9]\d)?\d{2}))$|^(?:29(?:(?:([-.\/])(?:0?2)\5)|(?:([-.\/ ])(?:Feb|FEB)\6))(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))$|^(?:(?:0?[1-9]|1\d|2[0-8])(?:(?:([-.\/])(?:(?:0?[1-9]|(?:1[0-2])))\7)|(?:([-.\/ ])(?:Jan|JAN|Feb|FEB|Mar|MAR|May|MAY|Jul|JUL|Aug|AUG|Oct|OCT|Dec|DEC)\8))(?:(?:1[6-9]|[2-9]\d)?\d{2}))$)

Тестовые примеры включены в демонстрацию Regex

Характеристики (сохранены):

  • Проверка високосного года (проверка 29 февраля) включает логику: (делится на 4, но не делится на 100) или (делится на 400)
  • Поддерживает годы 1600 ~ 9999
  • Поддерживает dd/mm/YYYY, dd-mm-YYYY, dd.mm.YYYY (но нет dd mm YYYY)
  • Поддерживает, dd-mmm-YYYY, dd/mmm/YYYY, dd.mmm.YYYY ( dd mmm YYYYнедавно добавлен. ммм может быть ЗАГЛАВНЫМ, например, DEC или в формате заголовка, например Dec)

Некоторые дополнительные незначительные исправления, такие как:

  1. Включено исправление Офира Лусона 14 февраля 2019 года для удаления запятой, которая была в регулярном выражении, которое допускало такие даты, как 29-0,-11 [ошибка реплицируется в регулярное выражение Алока Чаудхари]

  2. Заменены (\/|-|\.) от ([-.\/]) чтобы свести к минимуму использование обратной косой черты. \/ по-прежнему используется для поддержки некоторой разновидности регулярных выражений, например PCRE(PHP), хотя некоторые другие разновидности регулярных выражений, например, Python могут просто использовать / внутри класса персонажей []

  3. Добавлена ​​пара круглых скобок (), окружающая все регулярное выражение, чтобы сделать его захватывающей группой для всей совпадающей строки. Это полезно для людей, использующих функции типа findAll для получения списка совпадающих элементов (например, в Python). Это позволяет нам захватить все совпадающие строки внутри многострочной строки со следующими кодами:

re.findall образцы кодов:

      match_list = re.findall(regex, source_string)
for item in match_list:
    print(item[0])

Расширенное изображение регулярного выражения:

Следует отдать должное Офиру Лусону и Алоку Чаудхари, которые создали такие отличные регулярные выражения для всех нас!

На мой взгляд, лучший способ - использовать метод isValid() Moment.js, указав формат и используя строгий синтаксический анализ.

Как говорится в документации moment.js

Начиная с версии 2.3.0, вы можете указать логическое значение для последнего аргумента, чтобы Moment использовал строгий синтаксический анализ. Строгий синтаксический анализ требует, чтобы формат и ввод точно совпадали, включая разделители.

value = '2020-05-25';
format = 'YYYY-MM-DD';
moment(value, format, true).isValid() // true

Пожалуйста, следуя выражению

Regex regex = new Regex(@"(((0|1)[0-9]|2[0-9]|3[0-1])\/(0[1-9]|1[0-2])\/((19|20)\d\d))$");
import re
expression = "Nov 05 20:10:09 2020"
reg_ex = r'((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ([0-2][0-9]|(3)[0-1]) (([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])) (\d{4}))'
assert re.fullmatch(reg_ex, expression), True

Разъяснение по данному примеру

  • Ноя = A group of possible months i.e. (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
  • 05 = A group of valid days i.e. ([0-2][0-9]|(3)[0-1])
  • 20:10:09 = A group for getting valid Hours : ([0-1][0-9]|2[0-3]), Minutes : ([0-5][0-9]) and Seconds : ([0-5][0-9])
  • 2020 = A group for getting year i.e (\d{4}))

Я работаю с API, который принимает только формат MM/DD/YYYY. Я не смог найти ни одного другого поста, который прыгнул бы на годы так же хорошо, как и ответ Офира, поэтому я подправил его и опубликовал здесь для всех, кому это может понадобиться.

/^(?:(?:(?:0[13578]|1[02])(\/)31)\1|(?:(?:0[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:02(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/

простая функция для питона

      def is_valid_date(date_text):
    pattern = re.compile('\d{4}-\d{2}-\d{2}$')
    return pattern.match(date_text)

Если вы ищете конкретный формат, он отлично подходит для формата даты "дд / ММ / гггг" и "дд / МММ / гггг" только на основе ответа Alok.

function isValidDateFormatDDMMYYYY(inputDate) {
    var date_regex = /^(?:(?:31(\/)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:29|30)(\/)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/;
    return date_regex.test(inputDate);
}

Несколько примеров, работающих через этот код -

  • isValidDateFormatDDMMYYYY ("15.01.1999") // возвращает True
  • isValidDateFormatDDMMYYYY ("15 января 1999 г.") // возвращает True
  • isValidDateFormatDDMMYYYY ("15/1/1999") // возвращает True
  • isValidDateFormatDDMMYYYY ("15.01.1999") // возвращает False

Спасибо

((((0[13578]|1[02])\/(0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)\/(0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)(\/(0[1-9]|1[0-9]|2[0-8]))))\/(19([6-9][0-9])|20([0-9][0-9])))|((02)\/(29)\/(19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

будет проверять MM/DD/YYYY отформатировать с 1960 в 2028

если вам нужно продлить поддержку високосного года, то добавьте

19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048]|3[26]|4[048])))

это тоже работа

^((((0[13578]|1[02])[/](0[1-9]|1[0-9]|2[0-9]|3[01]))|((0[469]|11)[/](0[1-9]|1[0-9]|2[0-9]|3[0]))|((02)([/](0[1-9]|1[0-9]|2[0-8]))))[/](19([6-9][0-9])|20([0-9][0-9])))|((02)[/](29)[/](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

если вы можете изменить формат mm-dd-yyyy чем заменить [/] в [-] также проверьте онлайн http://regexr.com/

^(((([13578]|0[13578]|1[02])[-](0[1-9]|[1-9]|1[0-9]|2[0-9]|3[01]))|(([469]|0[469]|11)[-]([1-9]|1[0-9]|2[0-9]|3[0]))|((2|02)([-](0[1-9]|1[0-9]|2[0-8]))))[-](19([6-9][0-9])|20([0-9][0-9])))|((02)[-](29)[-](19(6[048]|7[26]|8[048]|9[26])|20(0[048]|1[26]|2[048])))

это регулярное выражение будет проверять даты в формате:

12-30-2016 (мм-дд-гггг) или 12-3-2016 (мм-д-гггг) или 1-3-2016 (мд-гггг) или 1-30-2016 (м-дд-гггг)

      /(0[1-9]|[12][0-9]|3[01])\-(0[1-9]|1[0,1,2])\-(19|20)\d{2}/

попробуйте это регулярное выражение, оно сработает ---> 24-02-1992

Пример ссылки https://regex101.com/r/6BmyWe/1

Для использования только в течение дня:

<input placeholder="day" maxlength="2" minlength="1" formControlName="birthDay" 
   name="birthDay"pattern="(0[1-9]|1[0-9]|2[0-9]|3[0-1])" >/

Для использования только в течение месяца:

 <input placeholder="month" maxlength="2" minlength="1" 
  formControlName="month" name="month" formControlName="month" name="month" pattern="(0[1- 
  9]|1[0-2])">/

Я знаю, что это тангенциальный ответ на вопрос, но если вопрос состоит в том, "как проверить дату?", То почему бы не попробовать позволить языку программирования выполнить всю тяжелую работу (если вы используете язык, который Можно)?

например в php

$this_date_object = date_create($this_date);

if ($this_date_object == false )
    {

        // process the error

    }

Я знаю, что прошло много времени с тех пор, как на это ответили, но, возможно, это могло бы помочь кому-то другому. Дело в том, что я хотел также проверить год и сопоставить некоторые прошлые годы. Даты совпадения регулярного выражения в формате «ДД-ММ-ГГГГ». Итак, эта функция вернет регулярное выражение:

Для даты ММ / ДД / ГГГГ вы можете использовать

^((((0[13578])|([13578])|(1[02]))[\/](([1-9])|([0-2][0-9])|(3[01])))|(((0[469])|([469])|(11))[\/](([1-9])|([0-2][0-9])|(30)))|((2|02)[\/](([1-9])|([0-2][0-9]))))[\/]\d{4}$|^\d{4}$

Это проверять правильные дни и мотыльки.

Помните, что вы можете проверить свое регулярное выражение на

regex101

который я рекомендую:)

Повеселись!

Это регулярное выражение для сопоставления строк формата даты,YYYY-MM-DD, с различными типами разделителей. Соответствует строке даже в предложениях и с датами, оканчивающимися наst,ndи другие.

Например, она соответствует дате в следующих предложениях:

      "Her birthday is 2022 February 23rd; I will present here a gift."

"Her birthday is 2022 Feb 23rd; I will present here a gift."

"Her birthday is 2022 02 23; I will present here a gift."

Это регулярное выражение даты:

      "\b
(?<YYYY>[0-9]{4})
(?<!0000)(?<sep>[ /.,-])
(?|
    (?:(?<MM>0[13578]|1[02]|Jan(?:uary)?|Mar(?:ch)?|May|Jul(?:y)?|Aug(?:ust)?|Oct(?:ober)?|Dec(?:ember)?)\g{sep}(?<DD>0[1-9]|[12][0-9]|3[01]))|
    (?:(?<MM>0[469]|11|Apr(?:il)?|Jun(?:e)?|Sep(?:tember)?|Nov(?:ember)?)\g{sep}(?<DD>0[1-9]|[12][0-9]|30))|
    (?:(?<MM>02|Feb(?:ruary)?)\g{sep}(?<DD>0[1-9]|[12][0-9]))
)
(?:
    (?<=[023][1])st|
    (?<=[02][2])nd|
    (?<=[02][3])rd|
    (?<=(?:0[4-9])|(?:1[0-9])|20|(?:2[4-9])|30)th
)?
[,;.]?
\b"x

ИМХО, нет смысла регулярному выражению проверять на високосный год, когда для него можно написать простую, понятную и понятную однострочник:

      is_leap_year(y) = ((y%4 == 0) && (y%100 != 0)) || (y%400 == 0)

Регулярные выражения предназначены для сопоставления строк, а не для выполнения вычислений. Лучший способ — сопоставить строку, а затем передать захваченнуюMMгруппа вis_leap_yearфункционировать, если его02,FebилиFebruary, чтобы проверить строку.

Другие вопросы по тегам