gpt4 book ai didi

javascript - 使用正则表达式验证使用 DD-Mon-YYYY 格式的日期

转载 作者:行者123 更新时间:2023-11-29 17:15:18 25 4
gpt4 key购买 nike

您好,我正在尝试验证以下格式的日期: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;
}

最佳答案

您的代码存在一些问题,但您的正则表达式没有问题,只是那个月份没有被分组。

其他变化

  • 转换月份的 switch 需要将 dtMonth 转换为小写,并且 case 语句需要匹配大小写。
  • 我使用 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;
}

jsFiddle

替代解决方案

您可能不喜欢非常复杂的正则表达式,但您可以通过处理正则表达式本身的切换来真正减少代码。下面通过匹配的组循环到未遇到未定义的然后偏移值来获取匹配的月份。

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;
}

jsFiddle

关于javascript - 使用正则表达式验证使用 DD-Mon-YYYY 格式的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18659614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com