您好我正在尝试以格式验证日期: 2011年3月3日或2007年12月12日。我目前有一个在3个月的月份失败的正则表达式。我可能只需要调整它以使其正常工作。
//function isDate(txtDate) {
function isDate(sender, args) {
var currVal = document.getElementById('<%=txtChange_Date.ClientID%>').value;
if (currVal == '')
return false;
//Declare Regex
var rxDatePattern = /^(\d{1,2})(\/|-)[a-zA-Z]{3}(\/|-)(\d{4})$/;
var dtArray = currVal.match(rxDatePattern); // is format OK?
if (dtArray == null)
return false;
//formerly //Checks for dd/mm/yyyy format.
//Checks for dd-MMM-yyyy format.
var dtDay = dtArray[1];
var dtMonth = dtArray[3];
var dtYear = dtArray[4];
switch(dtMonth)
{
case 'Jan':
dtMonth = '01';
break;
case 'Feb':
dtMonth = '02';
break;
case 'Mar':
dtMonth = '03';
break;
case 'Apr':
dtMonth = '04';
break;
case 'May':
dtMonth = '05';
break;
case 'Jun':
dtMonth = '06';
break;
case 'Jul':
dtMonth = '07';
break;
case 'Aug':
dtMonth = '08';
break;
case 'Sep':
dtMonth = '09';
break;
case 'Oct':
dtMonth = '10';
break;
case 'Nov':
dtMonth = '11';
break;
case 'Dec':
dtMonth = '12';
break;
}
if (dtMonth < 1 || dtMonth > 12)
return false;
else if (dtDay < 1 || dtDay > 31)
return false;
else if ((dtMonth == 4 || dtMonth == 6 || dtMonth == 9 || dtMonth == 11) && dtDay == 31)
return false;
else if (dtMonth == 2) {
var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
if (dtDay > 29 || (dtDay == 29 && !isleap))
return false;
}
return true;
}
答案 0 :(得分:3)
您的代码存在一些问题,但您的正则表达式没有问题,只是该月未被分组。
其他更改
switch
转换为小写所需月份的dtMonth
以及与案例匹配所需的案例陈述。parseInt
的整数。我不知道dtDay
或dtYear
是否存在问题,但导致dtMonth
出现问题。parseInt
更改后,我添加了一个不是数字检查和dtMonth
。<强>代码强>
function isDate(currVal) {
if (currVal == '') return false;
//Declare Regex
var rxDatePattern = /^(\d{1,2})(\/|-)([a-zA-Z]{3})(\/|-)(\d{4})$/;
var dtArray = currVal.match(rxDatePattern); // is format OK?
if (dtArray == null) return false;
var dtDay = parseInt(dtArray[1]);
var dtMonth = dtArray[3];
var dtYear = parseInt(dtArray[4]);
// need to change to lowerCase because switch is
// case sensitive
switch (dtMonth.toLowerCase()) {
case 'jan':
dtMonth = '01';
break;
case 'feb':
dtMonth = '02';
break;
case 'mar':
dtMonth = '03';
break;
case 'apr':
dtMonth = '04';
break;
case 'may':
dtMonth = '05';
break;
case 'jun':
dtMonth = '06';
break;
case 'jul':
dtMonth = '07';
break;
case 'aug':
dtMonth = '08';
break;
case 'sep':
dtMonth = '09';
break;
case 'oct':
dtMonth = '10';
break;
case 'nov':
dtMonth = '11';
break;
case 'dec':
dtMonth = '12';
break;
}
// convert date to number
dtMonth = parseInt(dtMonth);
if (isNaN(dtMonth)) return false;
else if (dtMonth < 1 || dtMonth > 12) return false;
else if (dtDay < 1 || dtDay > 31) return false;
else if ((dtMonth == 4 || dtMonth == 6 || dtMonth == 9 || dtMonth == 11) && dtDay == 31) return false;
else if (dtMonth == 2) {
var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
if (dtDay > 29 || (dtDay == 29 && !isleap)) return false;
}
return true;
}
替代解决方案
您可能不喜欢非常复杂的正则表达式,但您可以通过处理正则表达式本身的切换来真正减少代码。以下通过将匹配的组循环到未定义的未匹配的组中来获得匹配的月份,然后抵消该值。
function isDate(currVal) {
if (currVal == '') return false;
//Declare Regex
var rxDatePattern = /^(\d{1,2})(\/|-)(?:(\d{1,2})|(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|(aug)|(sep)|(oct)|(nov)|(dec))(\/|-)(\d{4})$/i;
var dtArray = currVal.match(rxDatePattern);
if (dtArray == null) return false;
var dtDay = parseInt(dtArray[1]);
var dtMonth = parseInt(dtArray[3]);
var dtYear = parseInt(dtArray[17]);
if (isNaN(dtMonth)) {
for (var i = 4; i <= 15; i++) {
if ((dtArray[i])) {
dtMonth = i - 3;
break;
}
}
}
if (dtMonth < 1 || dtMonth > 12) return false;
else if (dtDay < 1 || dtDay > 31) return false;
else if ((dtMonth == 4 || dtMonth == 6 || dtMonth == 9 || dtMonth == 11) && dtDay == 31) return false;
else if (dtMonth == 2) {
var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
if (dtDay > 29 || (dtDay == 29 && !isleap)) return false;
}
return true;
}
答案 1 :(得分:2)
你的正则表达式没问题,你没有用括号括住月子模式,所以你还没有定义一个捕获组。因此,你的switch语句失败了:
试
var rxDatePattern = /^(\d{1,2})(\/|-)([a-zA-Z]{3})(\/|-)(\d{4})$/;
和
var dtYear = dtArray[5]; // now 5 instead of 4
答案 2 :(得分:0)
您需要在一个月左右的括号中捕获它:
/^(\d{1,2})(\/|-)([a-zA-Z]{3})(\/|-)(\d{4})$/
这意味着您需要调整当年的指数:
var dtYear = dtArray[5]; // now 5 instead of 4
答案 3 :(得分:0)
看起来月份部分只缺少括号,使其成为一个单独的组。
/^(\d{1,2})(\/|-)([a-zA-Z]{3})(\/|-)(\d{4})$/
var dtDay = dtArray[1];
var dtMonth = dtArray[3];
var dtYear = dtArray[5];
答案 4 :(得分:0)
这是代码,不需要正则表达式,并且在日期解析中使用javascript构建。
var isDate = (function() {
var MONTHS = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
];
return function (date) {
var v = new Date(date);
var day = v.getDate();
if(day < 10) {
day = "0" + day;
}
var month = MONTHS[v.getMonth()];
var year = v.getFullYear();
var total = day + "-" + month + "-" + year;
return date.toUpperCase() == total.toUpperCase();
}
}());