我有以下功能,它以两种主要格式验证日期格式:有和没有分隔符。
function check_date_format (my_date) {
var regex = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{2})$/; //Declare regex for date with separators
var date_array = my_date.match(regex);
if (date_array == null) {
regex = /^(\d{2})(\d{2})(\d{2})$/; //Declare regex for date without separators
date_array = my_date.match(regex);
if (date_array == null) {
return false;
} else {
return true;
}
}
return true;
}
第一个.match(regex)
返回5个元素的数组:day(1或2位数),第一个分隔符( - 或/),月份(1或2位数),第二个分隔符( - 或/可以是与第一个分隔符不同)和年份(2位数)。
第二个.match(regex)
返回一个包含3个元素的数组:day(2位),month(2位)和year(2位)。
我试图将这两者与这个正则表达式合并:
/^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{2})$|^(\d{2})(\d{2})(\d{2})$/
验证有效,但my_date
成为8个单元格的数组,其中前5个或后3个将不确定,具体取决于正则表达式的哪个部分与模式匹配。
有没有办法合并这两个部分,只返回一个包含5个或3个单元格的数组,具体取决于匹配的部分?
这是一个fiddle,用于测试多种日期格式以及合并和拆分的正则表达式。
答案 0 :(得分:3)
这个正则表达式应该做你想要的:
/^(\d{1,2})([\/-]?)(\d{1,2})\2(\d{2})$/
日,月,年分别在捕获第1,3,4组。
我使用反向引用 \2
来确保第二个分隔符(年份和月份之间)与捕获组 2 中捕获的第一个分隔符相同([\/-]?)
。因此,它与您的代码略有不同:它不接受带有混合分隔符的输入,例如12/3-01
。