通过时间校验学习JavaScript正则表达式

| No Comments | No TrackBacks

   为什么要从时间验证的例子开始我们的正则表达之旅呢?首先,因为时间校验比较常用,尤其是日期的验证几乎是每个注册程序都要进行校验的;另外,日期函数相 对来说包含的涉及正则表达式的内容较少,其次字符单一除了数字之外,就是几个很有限的连接连接符号,正则逻辑简单。

    预备知识:
    1.为JavaScript增加函数:熟悉Java的人都是知道,Java所有的方法都是封装在类中的,那么JavaScript实际上类似(注意:我并 没有讨论JavaScript和Java的相关性,只是说道他们的相似性);JavaScript中所有的字符串操作实际上都是在String这个类中, 那么我们要为字符串增加一个日期校验的函数应该来怎么做呢?
     类名.prototype.方法名 = function (){
        /*语句块*/
     }
     比如我们为字符创类增加一个日期校验的方法IsDate:
     String.prototype.IsDate=function(){
     } 
     那么问题来了,这个字符串本身用什么来代表呢?数字面向对象的朋友很快就会想到this,对了就是它;


     2.正则表达式的基本知识:
        /  标识正则表达式的开始位置和基础位置
        ^  表示字符串的开始位置
        $  表示字符串的结束位置
        |  或者
        -  描述该字符串的是由(-)左右连个字符之间的所有字符构成
        {n,m}有n到m个字符串组成

     下面我们就开始日期校验函数的编写
      首先我们分析一个完整日期的构成,比如2005-9-13
      ?年份是后4位数字构成
      ?月份是由1-12的数字构成
      ?日期是由1-31的数字构成
      ?年份可以被四整除为闰年
      ?2月的闰年为29天,否则为28天
      ?1、3、5、7、8、10、12每个月的为31天
      ?4、6、9、11每个月为30天
      ?如果日期或月份为各位数,那么十位也可以加上0

      以上为我们分析的结果,那么根据我们的分析,我们先来构造自己的算法或者说方法。}

      年份:能被四整除的了,那么能被4整除的数字都什么特征呢?这是个数学问题了,如果你想不出来,可以再去翻一翻小学的数学书。这里我可以个告诉你以为十位 数为0、2、4、6、8个位为0、4、8以及十位是1、3、5、7、9各位是26可以被四整除。前两位是由0到9的两位数字组成[0-9]{2},后两位 闰年[02468][048]或者是[13579][26],完整闰年就是将这些都连起来([0-9]{2}([02468][048])|([13579][26]))那么非闰年呢?所有不能被4整除的就是,也就是把闰年的后两位反过来

      月份:接下来我们来从最特殊的入手,也就是2月,而其他的月份则与是否闰年无关先来看一下闰年的2月;2月的写法可以使2也可以是02,在正则里应该是[0]{0,1}[2]或者你也可以(2|02);还有大月(([0]{0,1}(1|3|5|7|8))|(10|12)、小月(([0]{0,1}(4|6))|11)

      日期:2月闰年是1到29天,非闰年是1到28天,从正则来考虑,十位是0到2,各位是0到8或0到9组成,闰年:([0][1-9])|([1-2][0-9],非闰年([0][1-9])|([1][0-9])|([2][0-8]),大月([0][1-9])|([1-2][0-9])|30|31小月([0][1-9])|([1-2][0-9])|30

     至此,我们的零部件已经制作完成,接下就是我们的组装过程,完整日期的合法性是怎么样子的呢?
     闰年-2月-闰2月的的日期
     或者
     非闰年-2月-非闰2月的的日期
     或者
     年份-大月-大月日期
     或者
     年份-小月-小月日期

润2月完整日期:(([0-9]{2}([02468][048])|([13579][26])))(-)(2|02)(-)(([0][1-9])|([1-2][0-9]))
非润2月完整日期:(([0-9]{2}([02468][123579])|([13579][01345789])))(-)(2|02)(-)(([0][1-9])|([1][0-9])([2][0-8]))
大月完整日期:([0-9]{4})(-)((([0]{0,1}(1|3|5|7|8))|(10|12))(-)(([0][1-9])|([1-2][0-9])|30|31)
小月完整日期:([0-9]{4})(-)((([0]{0,1}(4|6))|11))(-)(([0][1-9])|([1-2][0-9])|30)

     到这里我们的日期校验函数基本算是完工了,唯一要做的就是收尾工作了,把四个完整日期正则用|(或者)连起来,并且把它写到我们为String新增的函数中就算完工了:
   String.prototype.IsDate=function(){
    var
regexp = /^((([0-9]{2}([02468][048])|([13579][26])))(-)(2|02)(-)(([0][1-9])|([1-2][0-9])))|((([0-9]{2}([02468][123579])|([13579][01345789])))(-)(2|02)(-)(([0][1-9])|([1][0-9])([2][0-8])))|(([0-9]{4})(-)((([0]{0,1}(1|3|5|7|8))|(10|12))(-)(([0][1-9])|([1-2][0-9])|30|31))|(([0-9]{4})(-)((([0]{0,1}(4|6))|11))(-)(([0][1-9])|([1-2][0-9])|30))$/g;
    return
regexp.test(this);
  } 
    从现在开始我们就是这样来判断一个字符串是否为一个合法的日期了:
     var strDate ="2005-2-29"
     if(strDate.IsDate())
       
alert("这是一个正确的日期格式");
     else
       
alert("日期格式错误");

No TrackBacks

TrackBack URL: http://www.wujianrong.com/mt-tb.cgi/1420

Leave a comment

About this Entry

This page contains a single entry by kevinwu published on November 25, 2006 11:51 AM.

js二级下拉列表 was the previous entry in this blog.

用JavaScript实现UrlEncode和UrlDecode is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.