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

Posted

技术标签:

【中文标题】Javascript 日期正则表达式 DD/MM/YYYY【英文标题】:Javascript date regex DD/MM/YYYY 【发布时间】:2022-01-04 13:25:49 【问题描述】:

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

此正则表达式以 YYYY-MM-DD 格式验证

/^\d4[\/\-](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

非常感谢

【问题讨论】:

你确定正则表达式是这里的最佳选择吗? Regex to validate date format dd/mm/yyyy的可能重复 使用 (((0[1-9]|[12][0-9]|3[01])([/])(0[13578]|10|12)([/])(\d4))|(([0][1-9]|[12][0-9]|30)([/])(0[469]|11)([/])(\d4))|((0[1-9]|1[0-9]|2[0-8])([/])(02)([/])(\d4))|((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 格式验证日期,即使这也适用于 Leay year 验证,例如,这将在 29/02/2020 但不是 29/02/2019也不是 29/02/2100 【参考方案1】:

您可以使用验证 YYYY/MM/DD 的正则表达式并翻转它以获得 DD/MM/YYYY 所需的内容:

/^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d4$/

顺便说一句 - 此正则表达式验证 DD/MM/YYYY 或 DD-MM-YYYY

附:这将允许日期如 31/02/4899

【讨论】:

我试着翻转它,但我不确定每个块从哪里开始。可以编辑此正则表达式以允许 // 但不允许 - - 吗?谢谢! ^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/\-]\d4$ 正则表达式,如果您只想接受 DD/MM/YYYY 而不是 DD-MM-YYYY 2016 年 6 月 20 日也没有匹配。 查看@OammieR 的答案以获得更全面的正则表达式。 ***.com/a/14807681/246616【参考方案2】:

正则表达式适合匹配一般格式,但我认为您应该将解析移至 Date 类,例如:

function parseDate(str) 
  var m = str.match(/^(\d1,2)\/(\d1,2)\/(\d4)$/);
  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(/^(\d1,2)\/(\d1,2)\/(\d4)$/)
    , 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(/^(\d1,2)\/(\d1,2)\/(\d4)$/)
    , 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”​​由于零而无法通过非滚动验证。 不需要重建字符串。只需d.getDate() == m[1] && d.getMonth() == m[2] && d.getFullYear() == m[3] /^(\d1,2)\/(\d1,2)\/(?:\d4|\d2)$/ 。 ..我还想传递两位或四位数字的日期。没有什么特别的,只是在末尾添加 (?:\d4|\d2)。然后我还想传递包含连字符或反斜杠的日期 [/|-] 所以完整的语法看起来像这样...... ^(\d1,2)[/|-](\d1,2 )[/|-](?:\d4|\d2)$【参考方案3】:

从这里看https://www.regextester.com/?fam=114662

使用以下正则表达式详细信息,这也将支持闰年。

var reg = /^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d2))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d2))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d2))|(29\/02\/((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|(([1][26]|[2468][048]|[3579][26])00))))$/g;

Example

【讨论】:

这就像一个魅力。测试了很多日期及其在闰年以及 30 或 31 天的月份。 不幸的是,这在 1900 年之前的几年都失败了。例如 01/01/1899 失败。我在这里错过了什么吗? 如果我想检查这种格式 DD/MM/YYYY 而不是 MM/DD/YYYY?【参考方案4】:

花样斜线只是在/ 之前使用\,它将被转义。 (\/=> /)。

否则你是正则表达式 DD/MM/YYYY 可能是下一个:

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

解释:

[0-9]: 只是数字 24:长度为 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

【讨论】:

你的第一个测试没有通过 有很多有效日期没有通过您的正则表达式测试【参考方案5】:

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

【讨论】:

【参考方案6】:

尝试使用这个..

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

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

【讨论】:

考虑为您的正则表达式提供解释【参考方案7】:
((?=\d4)\d4|(?=[a-zA-Z]3)[a-zA-Z]3|\d2)((?=\/)\/|\-)((?=[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 编译就可以了

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】:

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

日期的正则表达式实际上很笨拙,而且很难正确处理,尤其是闰年等等。

【讨论】:

我需要正则表达式,因为我使用的是position-absolute.com/articles/… 那篇文章很大,您能详细说明一下吗? Date.parse 似乎不适用于 Chrome 上的英国日期格式 (dd/mm/yyyy)。它仅适用于美国格式 (mm/dd/yyyy)。【参考方案9】:

对于需要验证早于 1900 年的人来说,以下应该可以解决问题。实际上,这与[@OammieR][1] 给出的上述答案相同,但年份包括 1800 - 1899。

/^(((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((19|[2-9]\d)\d2))|((0[1-9]|[12]\d|3[01])\/(0[13578]|1[02])\/((18|[2-9]\d)\d2))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((19|[2-9]\d)\d2))|((0[1-9]|[12]\d|30)\/(0[13456789]|1[012])\/((18|[2-9]\d)\d2))|((0[1-9]|1\d|2[0-8])\/02\/((19|[2-9]\d)\d2))|(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 最初的想法。

【讨论】:

【参考方案10】:

jquery.validationengine-en.js 文件进行以下更改,并通过包含闰年更新 dd/mm/yyyy 内联验证:

"date": 
    // Check if date is valid by leap year
    "func": function (field) 
    //var pattern = new RegExp(/^(\d4)[\/\-\.](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])[\/\-\.](\d4)$/);
    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"

【讨论】:

【参考方案11】:

我建立这个定期检查月份 30/31 并让 2 月到 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))(\/)\d4$/)

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

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

【讨论】:

【参考方案12】:

这会验证像 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 类似的角度反应形式一起使用

【讨论】:

以上是关于Javascript 日期正则表达式 DD/MM/YYYY的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式来检测用换行符分隔的日期

转换为日期格式 dd/mm/yyyy

RegEx的封闭日期间隔

需要一些关于日期和文化的建议

将日期 javascript 从 yyyy/mm/dd 反转为 dd/mm/yyyy

字符串匹配正则表达式模式并替换为匹配的问题