提问者:小点点

如何测试不同日期格式的正则表达式


我可以有这样的不同日期:

DD-MM-YY
DD.MM.YYYY
YYYY/MM/DD

但日期中的分隔符可以是破折号-或点号.或正斜杠/

我已经尝试了可以工作的正则表达式,但是我需要检查是否输入了类似dd-MM/yy的日期,那么它应该是无效的,因为第一个分隔符是-,第二个分隔符是/

/^\d\d?\d?\d?[-\/.]\d?\d[-\/.]\d\d?\d?\d?$/.test(userDate)

如何检查第二个分隔符是否与第一个分隔符相同?


共3个答案

匿名用户

使用\d捕获数字,使用([-\/.])捕获第一个分隔符,使用正则表达式反向引用\1重新捕获与第一个捕获组中相同的分隔符的工作示例:

null

function testUserDate(userDate) {
  let regex = /^\d{1,4}([-\/.])\d{1,2}\1\d{1,4}$/;
  return regex.test(userDate);
}

console.log(testUserDate("2007-11-12")); // true
console.log(testUserDate("2007.11.12")); // true
console.log(testUserDate("2007/11/12")); // true
console.log(testUserDate("2007/11-12")); // false
console.log(testUserDate("2007.11/12")); // false
console.log(testUserDate("12-12-2007")); // true
console.log(testUserDate("12/12/2007")); // true
console.log(testUserDate("12.12.2007")); // true
console.log(testUserDate("12/12-2007")); // false
console.log(testUserDate("12-12.2007")); // false

匿名用户

您可以使用date like pattern,但请注意,这只会缩小可能的匹配范围,而不会验证日期本身。

若要匹配问题中列出的变体,可以使用交替项

要匹配一致的分隔符,可以使用捕获组([-/。])和对该组的反向引用\1\2

如果不想将年份限制为19或20,可以将(?:1920)更改为\d{2}

^(?:(?:19|20)\d\d([-/.])(?:0?[1-9]|1[012])\1(?:0?[1-9]|[12][0-9]|3[01])|(?:0?[1-9]|[12][0-9]|3[01])([-/.])(?:0?[1-9]|1[012])\2(?:19|20)(?:\d\d)?)$
  • ^字符串开始
  • (?:替换的非捕获组
    • 此部分将与年份匹配起始
    • (?:1920)\d\d([-/。])(?:0?[1-9]1[012])\1(?:0?[1-9][12][0-9]3[01])
    • 此部分将与年份匹配,年份部分有2个可选数字
    • (?:0?[1-9][12][0-9]3[01])([-/。])(?:0?[1-9]1[012])\2(?:1920)(?:\d\d)?

    正则表达式演示

匿名用户

如果希望要求分隔符保持一致,可以使用反向引用。 ^(1920)\d\d([-/.])(0[1-9]1[012])\2(0[1-9][12][0-9]3[01])$将匹配1999-01-01,但不匹配1999/01-01。