JavaScript日期正则表达式DD/MM/YYYY。

90

我知道有很多正则表达式的主题,但是我需要一个特定的模式,在任何地方都找不到。

这个正则表达式验证 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

我也不知道如何转义斜杠,我试图“看到”字符串中的逻辑,但对我来说就像试图“看到”矩阵代码一样难以理解。我将正则表达式字符串放在 options.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

非常感谢。


3
你确定正则表达式是在这里最好的选择吗? - Oleks
1
可能是验证日期格式dd/mm/yyyy的正则表达式的重复问题。 - rene
1
使用(((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])))来验证DD/MM/YYYY格式的日期,即使是闰年验证也可以,例如,这将验证29/02/2020但不会验证29/02/2019,也不会验证29/02/2100。 - Harendra Chauhan
13个回答

121
您可以取得验证 YYYY/MM/DD 的正则表达式,然后将其翻转以获得您需要的 DD/MM/YYYY:
/^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/

顺便提一句-这个正则表达式可以验证DD/MM/YYYY或DD-MM-YYYY格式的日期。

另外,此正则表达式还可允许像31/02/4899这样的日期。


1
我尝试翻转它,但我不确定每个块从哪里开始。这个正则表达式可以被编辑以允许 / / 但不允许 - - 吗?谢谢! - Juan Ignacio
1
^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/\-]\d{4}$ Regex if you just want to accept DD/MM/YYYY and not DD-MM-YYYY - lukehillonline
1
2016年6月20日也没有匹配项。 - Paul
1
请参考@OammieR的答案,了解更全面的正则表达式。https://dev59.com/Z2035IYBdhLWcg3wW-z1#14807681 - mVChr

47

正则表达式适用于匹配一般格式,但我认为您应该将解析移动到日期类中,例如:

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

[编辑2] 如果您想匹配零填充的日期(例如“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")仍将无法成功。


好主意!我发现的唯一问题是“08/08/2013”由于零的存在无法通过非滚动验证。 - Chris Haines
只需 d.getDate() == m[1] && d.getMonth() == m[2] && d.getFullYear() == m[3] - Richard Ayotte
/^(\d{1,2})/(\d{1,2})/(?:\d{4}|\d{2})$/ ... 我还想传递只有两个或四个数字的日期。没有什么特别的,只需在末尾添加 (?:\d{4}|\d{2})。然后我还想传递包含连字符或反斜杠 [/|-] 的日期,因此完整语法看起来像这样... ^(\d{1,2})/|-/|-$ - Code Novice

45

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

示例


3
这个功能非常好用。测试了很多日期,它能够适用于闰年以及拥有30或31天的月份。 - peter
2
很遗憾,这对于1900年之前的年份无法成功。例如,01/01/1899会失败。我是否漏掉了什么? - Anjana Silva
5
如果我想检查 DD/MM/YYYY 格式而不是 MM/DD/YYYY,该怎么办? - Ne AS

19

转义斜杠只需要在斜杠前面加上\即可进行转义,(\/=> /)。

否则你的正则表达式 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:全局匹配 (可选,根据您的需求)
  • $:锚定字符串末尾。(可选,根据您的需求)
  • ^:字符串开头。(可选,根据您的需求)

一个使用示例:

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
}

你的第一个测试未通过。 - mibbit
1
有许多有效的日期未能通过您的正则表达式测试。 - Alex
你写了这么多好的代码,但是当你运行它时,它却一个都不起作用。你在发布前检查过你的工作吗? - Craig

11

我使用这个函数来处理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);
}

9
尝试使用这个..
[0-9]{2}[/][0-9]{2}[/][0-9]{4}$

这应该使用这个模式DD/DD/DDDD,其中D是任何数字(0-9)。


考虑为您的正则表达式提供一份解释。 - arghtype

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

正则表达式在 IT 技术中的编译
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

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提供的初始想法。

1

如果你已经在使用Javascript,为什么不直接使用Date.Parse()来验证日期,而不是使用正则表达式呢?

对于日期的正则表达式实际上很难掌握,特别是考虑到闰年等因素。


我需要正则表达式,因为我正在使用http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/。 - Juan Ignacio
你能详细说明一下吗,因为那篇文章太长了? - jwize
在Chrome浏览器上,Date.parse似乎不支持英国的日期格式(dd/mm/yyyy),它只支持美国的日期格式(mm/dd/yyyy)。 - Jeff S.

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接