Подтвердить что ты не робот

Javascript date regex DD/MM/YYYY

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

Это регулярное выражение проверяется в формате YYYY-MM-DD

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

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

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

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

Я также не знаю, чтобы избежать слэш, я пытаюсь "увидеть" логику в строке, но мне нравится попробовать "увидеть" код Matrix для меня. Я помещаю строку регулярного выражения в опции .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..."[...]

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

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

4b9b3361

Ответ 1

Я использую эту функцию для формата 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);
}

Ответ 2

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

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

BTW - это регулярное выражение проверяет либо DD/MM/YYYY, либо DD-MM-YYYY

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

Ответ 3

Регулярное выражение хорошо подходит для сопоставления общего формата, но я думаю, что вы должны перенести синтаксический анализ на класс 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" ), у вас возникнет другая проблема.

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

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;
}

Однако он будет терпеть неудачу для несоответствующих дат (например, "8/08/2013" ).

Ответ 4

Взгляните сюда http://forums.asp.net/t/1410702.aspx/1

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

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])|((16|[2468][048]|[3579][26])00))))$/g;

Пример

Ответ 5

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

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

Ответ 6

((?=\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})

Regex Compile на нем

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

Ответ 7

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

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

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

Ответ 8

Слайс Scape просто используется \ до /, и он будет экранирован. (\/ = > /).

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

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

Объяснение:

  • [0-9]: Just Numbers
  • {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));
    });

Ответ 9

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

"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"

Ответ 10

Для людей, которым нужно проверять годы раньше, чем в 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 за исходную идею.

Ответ 11

Я создаю это регулярное, чтобы проверить месяц 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}$/)

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

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