javascript正则表达式,验证日期问题

时间:2009-03-19 05:04:53

标签: javascript regex validation

我有一些验证日期的代码:


function validateForm() {
var errFound = 0;       
//var patt_date = new RegExp("^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((0[1,3-9])|(1[0-2]))-(29|30)))))$");
var patt_date = new RegExp("^[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))$");
if (patt_date.test(document.getElementById("datefrom").value) == false){errFound = errFound + 1;document.getElementById("datefrom").className = "error";}

if (errFound > 0)
    alert('Please correct red colored field!');
else
    return true;
return false;   
}


以上代码应使用YYYY-MM-DD格式,但无法验证日期,例如“2009-02-29”

评论代码应该(// var patt_date = new RegExp ...),它可以捕获“2009-02-29”
但是当我输入无效数据并尝试纠正它时,它会破坏验证,在我纠正它们后,它会一直抱怨表单值有问题(特别是在有多个输入的表单上)

也许有人可以修复当前的正则表达式?

<小时/> 已编辑,我只想简单替换上面的正则表达式,意味着新的正则表达式模式不是验证日期的全新方法
作为参考,我只是从以下方式获取正则表达式: http://www.regexlib.com/REDetails.aspx?regexp_id=694
http://www.regexlib.com/REDetails.aspx?regexp_id=933

使用 2009-02-29 进行测试,第一个链接工作&amp;第二不是。同样问题只是第二个正则表达式没有检测到值 2009-02-29 无效而第一个可以(但它毁了我的代码?所以它一定是有问题的。)

谢谢,
德尔斯

3 个答案:

答案 0 :(得分:8)

不要使用正则表达式进行整个日期验证,这确实推动了regexp的设计限制。我会建议这个程序:

  1. 根据正则表达式/^\d{4}-\d{2}-\d{2}$/
  2. 检查日期
  3. 使用substr()提取年,月和日并转换为整数
  4. 使用一些if语句来验证整数。像这样:
  5.     if (month == 2) {
            if (day == 29) {
                if (year % 4 != 0 || year % 100 == 0 && year % 400 != 0) {
                    // fail
                }
            }
            else if (day > 28) {
                // fail
            }
        }
        else if (month == 4 || month == 6 || month  == 9 || month == 11) {
            if (day > 30) {
                // fail
            }
        }
        else {
            if (day > 31) {
                // fail
        }
    

    (当然可以更简洁地编写)或者,您可以使用Javascript的Date类执行此验证 - 您可能需要执行诸如解析日期,将其转换回字符串以及检查是否这两个字符串相等。 (我不是Javascript专家)

答案 1 :(得分:3)

我在这方面与大卫达成一致......正则表达式匹配不应被用作判断通过日期是否有效的独家标准。 Javascript验证中的常规过程涉及几个步骤:

一个。第一步是确保传递的字符串与期望的日期格式匹配,方法是将其与正则表达式进行匹配。以下可能是更严格的正则表达式。

// Assuming that the only allowed separator is a forward slash.
// Expected format: yyyy-mm-dd
/^[12][90][\d][\d]-[0-3]?[\d]-[01]?[\d]$/

湾第二步是将字符串解析为Date对象,该对象返回no。自1970年以来的毫秒数。使用此数字作为Date构造函数的参数。

℃。由于JS会自动将传递的日期翻转到最接近的有效值,因此您仍然无法确定创建的Date对象是否与传递的匹配。要确定是否发生这种情况,最好的方法是根据分隔符拆分传递的字符串,并比较各个日期组件:

// d is the created Date object as explained above.
var arrDateParts = inputDate.split("-");
if ((d.getFullYear() == arrDateParts[0]) && (d.getMonth() == arrDateParts[1]) && (d.getDate() == arrDateParts[2]))
  return true;
else
  return false;

答案 2 :(得分:-1)

此javascript代码完全验证日期。您可以将其复制并在浏览器中进行测试。

 var regDate = '^(19[0-9]{2}|2[0-9]{3})-(0[1-9]{1}|1[0-2]{1}){1}-(0[1-9]|(1|2)[0-9]|3[0-1]){1}$';
 var txt='2010-01-31';
 if(txt.match(regDate))
 {
    alert('date match');
 }