我使用以下代码验证dd/mm/yyyy
和dd.mm.yyyy
格式的日期格式。
function validateDate(date){
var matches, d, m, y, cDate, format, dateFormatObj;
dateFormatObj = { format: /^(\d{2})[./](\d{2})[./](\d{4})$/, monthPos: 2, datePos:1, yearPos:3}
format = dateFormatObj.format;
matches = format.exec(date);
d = matches[dateFormatObj.datePos];
m = matches[dateFormatObj.monthPos] - 1;
y = matches[dateFormatObj.yearPos];
cDate = new Date(y, m, d);
return cDate.getDate() == d && cDate.getMonth() == m && cDate.getFullYear() == y;
}
alert(validateDate('22/05/2017'))
这对我来说很好,可以验证基本日期。
我试图解决的问题是,如果月份,日期和年份值之间的分隔符(/或。)不同,那么它应该使其无效。
我尝试将正则表达式格式更改为/^(\d{2})[./](\d{2})\1(\d{4})$/
,基本上使用与指定相同的捕获组,但这似乎不起作用,“匹配”出现为空。我看了几篇帖子,但似乎缺少了一些东西。我该怎么做才能使这项工作。
JS小提琴 - https://jsfiddle.net/90dstrx5/
答案 0 :(得分:3)
您可以按如下方式重写正则表达式:
/^(\d{2})([./])(\d{2})\2(\d{4})$/
// ^ ^
// | +---- match capturing group #2
// +----------------- capturing group #2
请注意,“数字”现在可在结果的第1,第3和第4位置使用;分隔符将位于第2位。要消除任何混淆,请使用Array.splice()
来消除它:
function validateDate(date) {
var matches, d, m, y, cDate, format, dateFormatObj;
dateFormatObj = {
format: /^(\d{2})([./])(\d{2})\2(\d{4})$/,
monthPos: 2,
datePos: 1,
yearPos: 3
};
format = dateFormatObj.format;
matches = format.exec(date);
if (matches === null) {
return false;
}
matches.splice(2, 1);
d = matches[dateFormatObj.datePos];
m = matches[dateFormatObj.monthPos] - 1;
y = matches[dateFormatObj.yearPos];
cDate = new Date(y, m, d);
return cDate.getDate() == d && cDate.getMonth() == m && cDate.getFullYear() == y;
}
console.log(validateDate('22/05/2017')); // true
console.log(validateDate('22/05.2017')); // false
答案 1 :(得分:1)
我想不出一种调整正则表达式的方法。但这是一个解决方法,指定了两个分隔符。
function validateDate(date) {
var matches, d, m, y, cDate, format, dateFormatObj;
dateFormatObj = {
format1: /^(\d{2})[.](\d{2})[.](\d{4})$/,
format2: /^(\d{2})[/](\d{2})[/](\d{4})$/,
monthPos: 2,
datePos: 1,
yearPos: 3
}
format1 = dateFormatObj.format1;
format2 = dateFormatObj.format2;
matches = format1.exec(date) || format2.exec(date);
if (matches == null)
return false;
d = matches[dateFormatObj.datePos];
m = matches[dateFormatObj.monthPos] - 1;
y = matches[dateFormatObj.yearPos];
cDate = new Date(y, m, d);
return cDate.getDate() == d && cDate.getMonth() == m && cDate.getFullYear() == y;
}
alert(validateDate('22/05.2017'))