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

IT技术 javascript regex
2021-01-20 02:23:08

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

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

非常感谢

6个回答

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

PS 这将允许诸如 31/02/4899 之类的日期

有关更全面的正则表达式,请参阅@OammieR 的答案。stackoverflow.com/a/14807681/246616
2021-03-24 02:23:08
^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/\-]\d{4}$正则表达式,如果你只是想接受DD/MM/YYYY而不是DD-MM-YYYY
2021-03-25 02:23:08
2016 年 6 月 20 日也没有匹配项。
2021-03-26 02:23:08
我试着翻转它,但我不确定每个块从哪里开始。可以编辑此正则表达式以允许 / / 但不允许 - - 吗?谢谢!
2021-04-11 02:23:08

正则表达式适用于匹配通用格式,但我认为您应该将解析移至 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”​​),它仍然会失败。

/^(\d{1,2})\/(\d{1,2})\/(?:\d{4}|\d{2})$/ ... 我也想传递日期有两位或四位数字。没有什么特别的,只是在末尾添加 (?:\d{4}|\d{2})。然后我还想传递包含连字符或反斜杠 [/|-] 的日期,所以完整的语法看起来像这样...... ^(\d{1,2})[/|-](\d{1,2 })[/|-](?:\d{4}|\d{2})$
2021-03-16 02:23:08
无需重建字符串。只是d.getDate() == m[1] && d.getMonth() == m[2] && d.getFullYear() == m[3]
2021-03-22 02:23:08
好主意!我发现的唯一问题是“08/08/2013”​​由于零而无法通过非滚动验证。
2021-03-24 02:23:08

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

例子

这就像一个魅力。测试了很多日期及其闰年的工作,也测试了 30 或 31 天的月份。
2021-03-24 02:23:08
如果我想检查这种格式 DD/MM/YYYY 而不是 MM/DD/YYYY 怎么办?
2021-04-01 02:23:08
不幸的是,这在 1900 年之前的几年都失败了。例如 01/01/1899 失败了。我在这里错过了什么吗?
2021-04-11 02:23:08

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

否则你是正则表达式 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: Global -- 或m: Multiline(可选,请参阅您的要求)
  • $: 锚定到字符串的末尾。(可选,请参阅您的要求)
  • ^: 字符串的开始。(可选,请参阅您的要求)

使用示例:

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
}
有许多有效日期未通过您的 regExp 测试
2021-03-13 02:23:08
你的第一个测试没有通过
2021-04-08 02:23:08

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