Регулярное выражение даты Javascript ДД/ММ/ГГГГ

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

Это регулярное выражение проверяется в формате ГГГГ-ММ-ДД.

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

Мне нужно, чтобы шаблон был ДД/ММ/ГГГГ (первый день, так как он на испанском языке, и только "/", "-" не должны быть разрешены)

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

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

Я также не знаю, как избежать косых черт, я пытаюсь «увидеть» логику в строке, но для меня это все равно, что пытаться «увидеть» код матрицы. Я помещаю строку регулярного выражения в параметры .js

[...]  },
"date": {
                    "regex": (0[1-9]|[12][0-9]|3[01])[ \.-](0[1-9]|1[012])[ \.-](19|20|)\d\d,
                    "alertText": "Alert text AAAA-MM-DD"
                },
"other type..."[...]

Итак, если регулярное выражение в порядке, как мне его избежать? если это не так, какое правильное регулярное выражение и как мне его избежать? :П

Большое спасибо


person Juan Ignacio    schedule 28.03.2011    source источник
comment
Вы уверены, что регулярное выражение - лучший вариант здесь?   -  person Alex    schedule 29.03.2011
comment
Возможный дубликат Regex для проверки формата даты дд/мм/гггг   -  person rene    schedule 03.09.2016
comment
Используйте (((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\d{4}))|(([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\d{4}))|((29)(\/)(02)([/])([02468][048]00))|((29)([/])(02)([/])([13579][26]00))|((29)([/])(02)([/])([0-9][0-9][0][48]))|((29)([/])(02)([/])([0-9][0-9][2468][048]))|((29)([/])(02)([/])([0-9][0-9][13579][26]))) для проверки даты в формате ДД/ММ/ГГГГ. Даже это будет работать для проверки учебного года, например, это будет проверка 29/02/2020, но не 29/02/2019, а также не 29/02/2100.   -  person Th. H Chauhan    schedule 17.04.2020


Ответы (12)


Вы можете взять регулярное выражение, которое проверяет ГГГГ/ММ/ДД, и перевернуть его, чтобы получить то, что вам нужно для ДД/ММ/ГГГГ:

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

Кстати, это регулярное выражение проверяется либо на ДД/ММ/ГГГГ, либо на ДД-ММ-ГГГГ.

P.S. Это позволит такие даты, как 31/02/4899

person mVChr    schedule 28.03.2011
comment
Я попытался перевернуть его, но я не был уверен, где начинается каждый блок. Можно ли отредактировать это регулярное выражение, чтобы разрешить //, но не - -? Спасибо! - person Juan Ignacio; 30.03.2011
comment
^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/\-]\d{4}$ Регулярное выражение, если вы просто хотите принять DD/MM/YYYY, а не DD-MM-YYYY - person lukehillonline; 23.08.2016
comment
Нет совпадений и на 20.06.2016. - person Paul; 15.09.2016
comment
См. ответ @OammieR для более полного регулярного выражения. stackoverflow.com/a/14807681/246616 - person mVChr; 07.10.2016

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

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);
  return (m) ? new Date(m[3], m[2]-1, m[1]) : null;
}

Теперь вы можете использовать эту функцию для проверки допустимых дат; однако, если вам нужно на самом деле проверить без перемотки (например, «31/2/2010» не автоматически перекатывается на «3/3/2010»), у вас есть другая проблема.

[Edit] Если вы также хотите проверить без перестановки, вы можете добавить проверку для сравнения с исходной строкой, чтобы убедиться, что это та же дата:

function parseDate(str) {
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , nonRolling = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (nonRolling) ? d : null;
}

[Edit2] Если вы хотите сопоставить даты, дополненные нулями (например, "08/08/2013"), вы можете сделать что-то вроде этого:

function parseDate(str) {
  function pad(x){return (((''+x).length==2) ? '' : '0') + x; }
  var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/)
    , d = (m) ? new Date(m[3], m[2]-1, m[1]) : null
    , matchesPadded = (d&&(str==[pad(d.getDate()),pad(d.getMonth()+1),d.getFullYear()].join('/')))
    , matchesNonPadded = (d&&(str==[d.getDate(),d.getMonth()+1,d.getFullYear()].join('/')));
  return (matchesPadded || matchesNonPadded) ? d : null;
}

Тем не менее, он все равно не будет работать для непоследовательно заполненных дат (например, «08.08.2013»).

person maerics    schedule 28.03.2011
comment
Хорошая идея! Единственная проблема, которую я обнаружил, заключалась в том, что «08/08/2013» не пройдет проверку nonRolling из-за нулей. - person Chris Haines; 02.08.2013
comment
Нет необходимости перестраивать строку. Только 1_ - person Richard Ayotte; 24.05.2015
comment
/^(\d{1,2})\/(\d{1,2})\/(?:\d{4}|\d{2})$/ ... Я также хотел передать даты иметь две или четыре цифры. Ничего особенного, просто добавление в конце (?:\d{4}|\d{2}). Затем я также хотел передать даты, содержащие дефисы или обратную косую черту [/|-], чтобы ПОЛНЫЙ синтаксис выглядел так... ^(\d{1,2})[/|-](\d{1,2 })[/|-](?:\d{4}|\d{2})$ - person Code Novice; 12.11.2020

Взгляните отсюда https://www.regextester.com/?fam=114662.

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

var reg = /^(((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])|(([1][26]|[2468][048]|[3579][26])00))))$/g;

Пример

person OammieR    schedule 11.02.2013
comment
Это работает как шарм. Протестировано много дат и его работы с високосными годами, а также для месяцев с 30 или 31 днем. - person peter; 27.04.2013
comment
К сожалению, это не удается для лет до 1900 года. Например, 01.01.1899 не удается. Я что-то упустил здесь? - person Anjana Silva; 23.06.2015
comment
что, если я хочу проверить этот формат ДД/ММ/ГГГГ вместо ММ/ДД/ГГГГ? - person Ne AS; 15.03.2017

Косая черта Scape - это просто использовать \ перед /, и она будет экранирована. (\/=› /).

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

/^[0-9]{2}[\/]{1}[0-9]{2}[\/]{1}[0-9]{4}$/g

Объяснение:

  • [0-9]: Просто цифры
  • {2} или {4}: длина 2 или 4. Вы также можете использовать {2,4} для длины между двумя числами (в данном случае 2 и 4)
  • [\/]: Персонаж /
  • g: глобальный -- или m: многострочный (необязательно, см. ваши требования)
  • $: привязка к концу строки. (Необязательно, см. ваши требования)
  • ^: Начало строки. (Необязательно, см. ваши требования)

Пример использования:

var regex = /^[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}$/g;

var dates = ["2009-10-09", "2009.10.09", "2009/10/09", "200910-09", "1990/10/09", 
    "2016/0/09", "2017/10/09", "2016/09/09", "20/09/2016", "21/09/2016", "22/09/2016",
    "23/09/2016", "19/09/2016", "18/09/2016", "25/09/2016", "21/09/2018"];

//Iterate array
dates.forEach(
    function(date){
        console.log(date + " matches with regex?");
      console.log(regex.test(date));
    });

Конечно, вы можете использовать как логическое значение:

if(regex.test(date)){
     //do something
}
person Pau    schedule 20.09.2016
comment
твой первый тест не проходит - person mibbit; 09.01.2018
comment
Есть много допустимых дат, которые не проходят тест regExp. - person Alex; 01.02.2018

Я использую эту функцию для формата dd/mm/yyyy:

// (new Date()).fromString("3/9/2013") : 3 of september
// (new Date()).fromString("3/9/2013", false) : 9 of march
Date.prototype.fromString = function(str, ddmmyyyy) {
    var m = str.match(/(\d+)(-|\/)(\d+)(?:-|\/)(?:(\d+)\s+(\d+):(\d+)(?::(\d+))?(?:\.(\d+))?)?/);
    if(m[2] == "/"){
        if(ddmmyyyy === false)
            return new Date(+m[4], +m[1] - 1, +m[3], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
        return new Date(+m[4], +m[3] - 1, +m[1], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
    }
    return new Date(+m[1], +m[3] - 1, +m[4], m[5] ? +m[5] : 0, m[6] ? +m[6] : 0, m[7] ? +m[7] : 0, m[8] ? +m[8] * 100 : 0);
}
person edid    schedule 23.09.2013

Попробуйте использовать это..

[0-9]{2}[/][0-9]{2}[/][0-9]{4}$

это должно работать с этим шаблоном DD/DD/DDDD, где D - любая цифра (0-9)

person bkaancelen    schedule 17.08.2015
comment
Подумайте о том, чтобы дать объяснение вашему регулярному выражению - person arghtype; 17.08.2015

((?=\d{4})\d{4}|(?=[a-zA-Z]{3})[a-zA-Z]{3}|\d{2})((?=\/)\/|\-)((?=[0-9]{2})[0-9]{2}|(?=[0-9]{1,2})[0-9]{1,2}|[a-zA-Z]{3})((?=\/)\/|\-)((?=[0-9]{4})[0-9]{4}|(?=[0-9]{2})[0-9]{2}|[a-zA-Z]{3})

Компиляция регулярных выражений

2012/22/Jan
2012/22/12 
2012/22/12
2012/22/12
2012/22/12
2012/22/12
2012/22/12
2012-Dec-22
2012-12-22
23/12/2012
23/12/2012
Dec-22-2012
12-2-2012
23-12-2012
23-12-2012
person user1693371    schedule 02.07.2015

Если вы уже используете Javascript, не могли бы вы просто использовать Date.Parse() для проверки даты вместо использования regEx.

RegEx для даты на самом деле громоздкий, и его трудно понять, особенно с високосными годами и всем остальным.

person Naraen    schedule 28.03.2011
comment
Мне нужно регулярное выражение, потому что я использую position-absolute.com/articles/ - person Juan Ignacio; 30.03.2011
comment
Не могли бы вы уточнить, поскольку эта статья огромна? - person jwize; 21.04.2014
comment
Date.parse, похоже, не работает с форматом даты в Великобритании (дд/мм/гггг) в Chrome. Он работает только с американским форматом (мм/дд/гггг). - person Jeff S.; 10.03.2015

Для людей, которым необходимо подтвердить годы до 1900 года, следующее должно помочь. На самом деле это то же самое, что и приведенный выше ответ, данный [@OammieR][1], НО с годами, включая 1800-1899.

/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((18|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d{2}))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((18|[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))))$/

Надеюсь, это поможет кому-то, кому нужно проверить годы до 1900 года, например 01/01/1855 и т. д.

Спасибо @OammieR за первоначальную идею.

person Anjana Silva    schedule 23.06.2015

Внесите следующие изменения в файл jquery.validationengine-en.js и обновите встроенную проверку дд/мм/гггг, включив високосный год:

"date": {
    // Check if date is valid by leap year
    "func": function (field) {
    //var pattern = new RegExp(/^(\d{4})[\/\-\.](0?[1-9]|1[012])[\/\-\.](0?[1-9]|[12][0-9]|3[01])$/);
    var pattern = new RegExp(/^(0?[1-9]|[12][0-9]|3[01])[\/\-\.](0?[1-9]|1[012])[\/\-\.](\d{4})$/);
    var match = pattern.exec(field.val());
    if (match == null)
    return false;

    //var year = match[1];
    //var month = match[2]*1;
    //var day = match[3]*1;
    var year = match[3];
    var month = match[2]*1;
    var day = match[1]*1;
    var date = new Date(year, month - 1, day); // because months starts from 0.

    return (date.getFullYear() == year && date.getMonth() == (month - 1) && date.getDate() == day);
},
"alertText": "* Invalid date, must be in DD-MM-YYYY format"
person Jayesh Bhalodia    schedule 13.03.2013

Я строю это регулярно, чтобы проверить месяц 30/31 и пусть февраль до 29.

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

Я думаю, что это более просто, более гибко и достаточно полно.

Возможно, первая часть может быть контрактом, но я не нахожу ее должным образом.

person YannickIngenierie    schedule 04.09.2015

Это проверяет дату, например дд-мм-гггг

([0-2][0-9]|(3)[0-1])(\-)(((0)[0-9])|((1)[0-2]))(\-)([0-9][0-9][0-9][0-9])

Это можно использовать с javascript, например, с угловыми реактивными формами.

person Visakh V A    schedule 17.11.2020