Javascript - 用于验证日期格式的正则表达式

IT技术 javascript regex
2021-02-26 00:15:18

有没有办法在 JavaScript 中使用正则表达式来验证多种格式的日期,例如:DD-MM-YYYY 或 DD.MM.YYYY 或 DD/MM/YYYY 等?我需要在一个正则表达式中包含所有这些,但我并不擅长它。到目前为止,我已经想出了这个:var dateReg = /^\d{2}-\d{2}-\d{4}$/;对于 DD-MM-YYYY。我只需要验证日期格式,而不是日期本身。

6个回答

您可以使用字符类 ( [./-]) 以便分隔符可以是任何定义的字符

var dateReg = /^\d{2}[./-]\d{2}[./-]\d{4}$/

或者更好的是,匹配第一个分隔符的字符类,然后将其捕获为一个组([./-])并使用对捕获组的引用\1来匹配第二个分隔符,这将确保两个分隔符相同:

var dateReg = /^\d{2}([./-])\d{2}\1\d{4}$/

"22-03-1981".match(dateReg) // matches
"22.03-1981".match(dateReg) // does not match
"22.03.1981".match(dateReg) // matches
您可以为第一个数字(月份)添加一个不超过“3”的限制吗?
2021-04-16 00:15:18
尝试 var dateReg = /^0[123]([./-])\d{2}\1\d{4}$/
2021-04-17 00:15:18
或者干脆你可以使用这个npmjs.com/package/raysk-vali进行日期验证等等。
2021-04-22 00:15:18
我不认为斜线需要在字符类中转义,但如果你想转义它也没有坏处。可能会使文本编辑器中的语法突出显示效果更好,但无论如何都应该起作用。
2021-04-23 00:15:18
谢谢。除了斜线“/”没有被正确转义外,它工作正常。
2021-04-30 00:15:18

格式、日、月和年:

var regex = /^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$/;

@BillyMoon Format, days, months and year:,你在说什么?
2021-04-15 00:15:18
这部分验证了日期,但仍然允许使用30-02-2013无效的日期需要更复杂的规则来说明不同的月份长度。
2021-04-17 00:15:18
是的,我的旨在从有效日期中提取数字,并且不会尝试进行验证,而您的验证是这样做的。我认为通过一些调整,您可以对日期进行合理的验证,我希望看到您这样做,但是在我看来,验证它们的一半就像在悬崖边上有一个薄弱的围栏,最好根本没有,以免有人倾斜在上面!最好还是有一个强大的。
2021-04-21 00:15:18
@Dropout - 你的问题是针对@nicoabie 的吗?
2021-05-01 00:15:18
从技术上讲@BillyMoon,我们实际上是在验证它的格式,而不是日期本身。你的朋友也允许像 30-02-2013 这样的日期。
2021-05-08 00:15:18

建议的正则表达式不会验证日期,只会验证模式。

所以 99.99.9999 将通过正则表达式。

您后来指定只需要验证模式,但我仍然认为创建日期对象更有用

function isDate(str) {    
  var parms = str.split(/[\.\-\/]/);
  var yyyy = parseInt(parms[2],10);
  var mm   = parseInt(parms[1],10);
  var dd   = parseInt(parms[0],10);
  var date = new Date(yyyy,mm-1,dd,0,0,0,0);
  return mm === (date.getMonth()+1) && dd === date.getDate() && yyyy === date.getFullYear();
}
var dates = [
    "13-09-2011", 
    "13.09.2011",
    "13/09/2011",
    "08-08-1991",
    "29/02/2011"
]

for (var i=0;i<dates.length;i++) {
    console.log(dates[i]+':'+isDate(dates[i]));
}    

无效日期值的验证将由我手动完成。如果我在您的解决方案中输入类似 08-08-1991 的内容,由于某种原因,我会在 javascript 中得到一个“无效日期”。
2021-04-26 00:15:18
不在 Fx 中:我将该日期添加到jsfiddle.net/mplungjan/Mqh8D你是哪种浏览器?
2021-05-02 00:15:18
如果使用 parseInt,则必须使用基数 10,因为 08 和 09 是无效的八进制数
2021-05-06 00:15:18

您可以使用 OR (|) 运算符来使用正则多个表达式。

function validateDate(date){
    var regex=new RegExp("([0-9]{4}[-](0[1-9]|1[0-2])[-]([0-2]{1}[0-9]{1}|3[0-1]{1})|([0-2]{1}[0-9]{1}|3[0-1]{1})[-](0[1-9]|1[0-2])[-][0-9]{4})");
    var dateOk=regex.test(date);
    if(dateOk){
        alert("Ok");
    }else{
        alert("not Ok");
    }
}

以上函数可以验证 YYYY-MM-DD、DD-MM-YYYY 日期格式。您可以简单地扩展正则表达式来验证任何日期格式。假设您要验证 YYYY/MM/DD,只需将“[-]”替换为“[-|/]”。此表达式可以验证日期为 31,月份为 12。但闰年和月份以 30 天结束不会验证。

我会投票给你,因为你给出了我更简洁的版本
2021-04-26 00:15:18