我可以有这样的不同日期:
DD-MM-YY
DD.MM.YYYY
YYYY/MM/DD
但日期中的分隔符可以是破折号-
或点号.
或正斜杠/
。
我已经尝试了可以工作的正则表达式,但是我需要检查是否输入了类似dd-MM/yy
的日期,那么它应该是无效的,因为第一个分隔符是-
,第二个分隔符是/
/^\d\d?\d?\d?[-\/.]\d?\d[-\/.]\d\d?\d?\d?$/.test(userDate)
如何检查第二个分隔符是否与第一个分隔符相同?
使用\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])
或(?: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。