• 正则表达式:日期,电话,邮箱等常用字符串;js中日期的带下的比较,获取不同格式的日期


    一、日期

    (1)首先需要验证年份,显然,年份范围为 0001 - 9999,匹配YYYY的正则表达式为:

    [0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}

    或者:d{3}[1-9]|d{2}[1-9]d{1}|d{1}[1-9]d{2}|[1-9]d{3},也就说可以用[0-9] 也可以表示为d,下面为了只管显示,只用前者表示。

    (2)难点:①大小月份的天数不同②闰年的考虑

    难点一:大小月份的天数不同

    1)月份为 1, 3, 5, 7, 8, 10, 12,天数范围为 01 - 31,匹配MM-DD的正则表达式为:(0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01])

    2)月份为 4, 6, 9, 11,天数范围为 01-30,匹配MM-DD的正则表达式为:(0[469]|11)-(0[1-9]|[12][0-9]|30)

    3)月份为 2,考虑平年情况,匹配MM-DD的正则表达式为:02-(0[1-9]|[1][0-9]|2[0-8])

    从上面的分析,可以得到匹配平年日期格式为YYYY-MM-DD的正则表达式:

    ([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8])))

    难点二:闰年

    1)能被4整除但不能被100整除的年份。寻找后两位的变化规律,可以很快得到下面的正则匹配:([0-9]{2})(0[48]|[2468][048]|[13579][26])

    2)能被400整除的年份。能被400整除的数肯定能被100整除,因此后两位肯定是00,我们只要保证前两位能被4整除即可,相应的正则表达式为:

    (0[48]|[2468][048]|[3579][26])00

    综上所述,不仅可以验证不同月份,而且验证闰年,可以支持以下的几种日期格式:YYYY-MM-DD;YYYY/MM/DD;YYYY_MM_DD;YYYY.MM.DD的形式

    match : 2008-2-29 2008/02/29                     not match : 2008-2-30   2007-2-29(月份天数不对)

    所以可以得到完整的日期正则表达式:

    ((^((1[8-9]d{2})|([2-9]d{3}))([-/._])(10|12|0?[13578])([-/._])(3[01]|[12][0-9]|0?[1-9])$)|(^((1[8-9]d{2})|([2-9]d{3}))([-/._])(11|0?[469])([-/._])(30|[12][0-9]|0?[1-9])$)|(^((1[8-9]d{2})|([2-9]d{3}))([-/._])(0?2)([-/._])(2[0-8]|1[0-9]|0?[1-9])$)|(^([2468][048]00)([-/._])(0?2)([-/._])(29)$)|(^([3579][26]00)([-/._])(0?2)([-/._])(29)$)|(^([1][89][0][48])([-/._])(0?2)([-/._])(29)$)|(^([2-9][0-9][0][48])([-/._])(0?2)([-/._])(29)$)|(^([1][89][2468][048])([-/._])(0?2)([-/._])(29)$)|(^([2-9][0-9][2468][048])([-/._])(0?2)([-/._])(29)$)|(^([1][89][13579][26])([-/._])(0?2)([-/._])(29)$)|(^([2-9][0-9][13579][26])([-/._])(0?2)([-/._])(29)$))

    闰年的2月份有29天,因此匹配闰年日期格式为YYYY-MM-DD的正则表达式为:

    (([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29

    最后,将平年和闰年的日期验证表达式合并,我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为:

    (([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)

    DD/MM/YYYY格式的正则验证表达式为:

    (((0[1-9]|[12][0-9]|3[01])/((0[13578]|1[02]))|((0[1-9]|[12][0-9]|30)/(0[469]|11))|(0[1-9]|[1][0-9]|2[0-8])/(02))/([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3}))|(29/02/(([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00)))

    二、时间

    格式如:12:00:00,正则表达式:/^(20|21|22|23|[0-1]d):[0-5]d:[0-5]d$/

    三、简单日期+时间

    格式如:2014-01-01 12:00:00,正则表达式:

    /^[1-9]d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])s+(20|21|22|23|[0-1]d):[0-5]d:[0-5]d$/;

    四、邮箱

    格式如:xx@xx.com,正则表达式:

     /([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)/;

    五、手机号或者电话号

    格式如:13222222222,025-83442323-366,正则表达式

    /^((d{11})|^((d{7,8})|(d{4}|d{3})-(d{7,8})|(d{4}|d{3})-(d{7,8})-(d{4}|d{3}|d{2}|d{1})|(d{7,8})-(d{4}|d{3}|d{2}|d{1}))$)$/;

    应用:

    正则表达式在js中的应用,使用方法:RegExp(参数)

    具体实现如下所示:(以时间为例)

    var reg = /^[1-9]d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])s+(20|21|22|23|[0-1]d):[0-5]d:[0-5]d$/;

    var regExp = new RegExp(reg);

    if(!regExp.test(value)){   

      alert("时间格式不正确,正确格式为: 2014-01-01 12:00:00 ");   

      return;   

    }

     

    第二部分

    (1):js中日期大小的比较

    var time1=new Date();  //当前时间
    var startTime='2017-09-09 12:09:09';
     var time2 = new Date(startTime.replace("-", "/").replace("-", "/"));
     if(time1 > time2){
      alert("time1时间要小于time2时间!");
      return null;
     }

    (2)获取日期

    1)获取格式如:2017-09-09

    var s=new Date();

    function getPreDay(s){
        var y = s.getFullYear();
        var m = s.getMonth();
        var d = s.getDate()-1;
        var dt = new Date(y, m, d);
        y = dt.getFullYear();
        m = dt.getMonth()+1;
        d = dt.getDate();
        m = m>10?m:"0"+m;
        d = d>10?d:"0"+d;
        return y + "-" + m + "-" + d;
    }

    2)获取日期为后一年:
      var fzrq='2017-09-09';
       fzrq=(parseInt(fzrq.substring(0,4))+1)+fzrq.substring(4);
      可以获得的日期为:'2018-09-09'

    3)获取当前日期,格式如:'2017-09-09'

    var d= new Date(); 

    getPreDay(d);    //返回值为'2017-09-08',注意getPreDay(d)这个函数是前面讲过的

     
     var day = new Date(d.getFullYear(),d.getMonth(),d.getDate()+1);

    getPreDay(day);    //返回值为'2017-09-09'

  • 相关阅读:
    sqlserver中递归写法
    keytools命令生成证书
    java中sql语句快速处理
    select * 替换写法
    oracle行转列
    oracle中查看当前用户的表结构、主键、索引
    Servlet三种实现方式
    【python之旅】python的面向对象
    【python之旅】python的模块
    【python之旅】python的基础三
  • 原文地址:https://www.cnblogs.com/lojun/p/6545680.html
Copyright © 2020-2023  润新知