Регулярное выражение Javascript для проверки даты - PullRequest
0 голосов
/ 25 апреля 2011

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

^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$

Спасибо

Ответы [ 6 ]

2 голосов
/ 25 апреля 2011

Я видел, что некоторые регулярные выражения монстров совпадают с фактическими датами - они не будут соответствовать 04/31 / гггг, например, или 29-29-2011.

Проще попытаться сделать дату из ввода, а затем проверить ввод.

function isvalid_mdy(s){
    var day, A= s.split(/\D+/).map(function(itm){
        return parseInt(itm, 10)
    });
    try{
        day= new Date(A[2], A[0]-1, A[1]);
        if(day.getMonth()+1== A[0] && day.getDate()== A[1]) return day;
        throw 'Bad Date Format';
    }
    catch(er){
        return NaN;
    }

}

var s1= '04/31/2011';
isvalid_mdy(s1)

/*  returned value: (Number)
NaN

* /

2 голосов
/ 25 апреля 2011
/^\d{2}([.\/-])\d{2}\1\d{4}$/

будет соответствовать 01/01/2000, 01.01.2000, НЕ 01/01.2000

/^(\d{2})([.\/-])(\d{2})\2(\d{4})$/

делает то же самое при переносе трех частей даты.

2 голосов
/ 25 апреля 2011
/^\d{2}[.\/-]\d{2}[.\/-]\d{4}$/

jsFiddle .

Обратите внимание, что это позволит их перепутать, т.е. 01/02-2010 будет действительным.Чтобы прекратить это, напишите это три раза, как ....)


В заголовке вашего вопроса написано ...

Регулярное выражение Javascript для проверки даты

Если вам также нужно извлечь частиоберните их круглыми скобками (()), которые превратят их в группы захвата.Они будут сохранены в элементах возвращаемого массива в случае успешного совпадения.

0 голосов
/ 25 апреля 2011

Интересный трюк в том, что вы можете использовать Date.parse (), чтобы сделать что-то вроде этого:

// 1303617600000
Date.parse('4/24/2011')

// 1303617600000
Date.parse('4-24-2011')

// 1303617600000
Date.parse('4.24.2011')

// NaN
Date.parse('4/32/2011')

// NaN
Date.parse('foo')

Это не совсем строго. Например, он успешно проанализирует 30.02.2011 как действительный. Это хороший 99% -й строгий тест на здравомыслие.

0 голосов
/ 25 апреля 2011

Мне не нравится повторять шаблоны по одному для ., - и /

Попробуйте что-то вроде следующего:

^(\d{2})(\/|-|\.)(\d{2})\2(\d{4})$

Обратите внимание на использование\2 представляет вторую подходящую группу, которая является группой ., - или /.Это обеспечит совпадение любого символа между мм и дд между дд и гггг.

0 голосов
/ 25 апреля 2011

В PHP я использую именованные совпадения, поэтому разные форматы просты:

$format = 'y-m-d'; // or 'd-m-y' or 'd/m/y' etc
$regexp = '#^'.strtr(preg_quote($format), array('y' => '(?P<year>(?:1|2)\d{3})', 'm' => '(?P<month>\d\d?)', 'd' => '(?P<day>\d\d?)')).'$#';

, но я не думаю, что это возможно в JS.Может быть, имя совпадает другим способом ...

edit
Я пробовал это:

'2004-8-29'.match(/^(\3\d{4})-(\2\d\d?)-(\1\d\d?)$/)

, но я не думаю, что это все ... (Обратите внимание на \ 3, \ 2 и \ 1 до фактического захвата / совпадения)

В порядке 1, 2, 3 оно совпадает.В порядке 3, 2, 1 это не так.Не уверен, что \1, \2 и \3 делают =)

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