Javascript日期正则表达式DD / MM / YYYY

时间:2011-03-28 21:37:18

标签: javascript regex

我知道那里有很多正则表达式线程我需要一个我无法在任何地方找到的特定模式

此正则表达式以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

我也不知道为了逃避斜线,我试图“看到”字符串中的逻辑,但这就像是为我“看”矩阵代码。我将正则表达式字符串放在选项.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

非常感谢

12 个答案:

答案 0 :(得分:73)

您可以使用验证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

答案 1 :(得分:33)

正则表达式适用于匹配常规格式,但我认为你应该将解析移到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”不会自动滚动到“2010年3月3日”),那么您还有另一个问题。

[编辑] 如果您还想在不滚动的情况下进行验证,则可以添加一个检查以与原始字符串进行比较,以确保它是相同的日期:

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”​​),它仍然会失败。

答案 2 :(得分:31)

从这里查看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;

Example

答案 3 :(得分:10)

我将此功能用于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);
}

答案 4 :(得分:6)

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




当然你可以使用boolean:

if(regex.test(date)){
     //do something
}

答案 5 :(得分:4)

尝试使用此..

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

这应该适用于这种模式DD/DD/DDDD,其中D是任何数字(0-9)

答案 6 :(得分:2)

如果你已经使用Javascript,那么你不能只使用Date.Parse()来验证日期而不是使用regEx。

日期的RegEx实际上很难实现,特别是在闰年和所有情况下都难以实现。

答案 7 :(得分:2)

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

答案 8 :(得分:1)

对于需要在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最初的想法。

答案 9 :(得分:0)

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 :(得分:0)

我建立这个定期检查月30/31,并让2月到29日。

@

我认为,它更简单,更灵活,更充实。

也许第一部分可以合同,但我找不到合适的。

答案 11 :(得分:0)

这将验证日期,例如dd-mm-yyyy

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

这可以与诸如角反应形式的javascript一起使用