Javascript日期处理中正则的应用


2009-10-14 14:47 Javascript&jQuery 没有评论346

正则表达式是一个非常非常非常强大的语言,这里连续用了三个非常,我觉得还不够,它娇小但却功能强大,绝对的浓缩的就是精华,我发现我越来越喜欢它了。

这段时间做日期的处理,需要用到日期的计算,包括加减什么的,于是做了一个公用处理的扩展,叫String.prototype.dateExpression。因为日期处理都会用到表达式,例如增加10天,我一般会用10d或者+10d一表示,这样不用每个函数都加上太多的参数。例如:

function dateAdd(date1, date2, interval, number)

Date.prototype.dateAdd = function(expr) //expr, eg. +10d,-5y, +20m…..

对比一下,这两个函数哪一个更简约呢?毫无疑问,第二个函数在调用的时候要更加简单,来看分析expr中表达式的函数,先看这个:

//获取日期的偏移量
//获取分析后的日期偏移量数据
String.prototype.dateExpression = function() {
    var pattern = "^[+-]\\d+(ms)|[yMdhms]$";
    //这里有个小技巧,(ms)应该放到前面,因为放到后面会和m及s冲突,
    //或者也可以把[]的ms分到不同的位置,如yMdmhs
    var reg = new RegExp(pattern);
    if (reg.test(this)) {
        var interval = this.substr(this.length - 1, 1);         //单位
        var symbol = this.substr(0, 1);
        var num = parseInt(this.substr(1, this.length - 2));
        if (symbol == "-") num = -num;
        return {
            interval: interval,
            number: num
        }
    }
    else {
        return null;
    }
}

这段代码可以把一个日期处理表达式如-10d分解成一个结构体返回,返回的结构大概是这样:

        return {
            interval: interval,  //时间部分的缩写,如m表示分钟,表示年等
            number: num //返回偏移的数值
        }

是不是很意思,可是,有什么问题吗?好像没有问题,代码能完全正常工作,还使用了正则,看上去还挺高级的,返回结果完全正常,效率也不会低到哪里去。还需要改正吗?当然需要,一个优秀的程序员应该不停改善自己的代码,只有更好,没有最好。上面的代码为什么我们不能简短一些呢?wow,试一下,或者有更好的办法,来看下一个代码:

//获取分析后的日期偏移量数据
String.prototype.dateExpression = function() {
    var pattern = "^([+-]*)(\\d+)([yMdhms]|(ms))$";
    if (RegExp(pattern).test(this)) {
        return {
            interval: RegExp.$3,
            number: parseInt((RegExp.$1 == "" || RegExp.$1 == "+") ? RegExp.$2 : -RegExp.$2)
        }
    }
    else {
        return null;
    }
}

对比一下,第一段代码是17行,第二段代码是12行,我们省了5行代码,也就节省了近30%的代码量,如果这样,一个项目是不是可以节省了这么多呢?了关键的是,在第一段代码中,我们使用了4个变量,而在第二段代码中,我们居然没有使用变量,这样的可读性是不是就强了呢?

来看第二段代码的小技巧,首先在正则中,我使用了捕获组(可惜javascript不支持命名捕获组),然后使用正则的test函数判断是否匹配,当匹配之后,就可以使用RegExp.$1来取得其中一个捕获组了。

wow,酷吗,so cool!正准备将日期处理的javascript放出来,不过我需要一些时间写文档,呵,等一等,就快了,关注我的blog吧,没准哪天就放出来,oh yeah.

无觅相关文章插件,快速提升流量

嗯,或者你也可以收听我的微博,腾讯微博(主要用这个,其他的看我的个人介绍)

我写博客常常出现错别字,常常错得还很离谱,有时候我自己看了第二遍都骂我自个儿,但我又不习惯重复审查,纠结啊...各位看到啥错别字或者不明白的地方,请给我留言指出来,感谢感谢。

  

  • 评论敬告那些为做SEO而评论的朋友,本博不欢迎此类评论,请不要利用本博做关键字,一律封杀。

    绝不跨省追捕
    不会发垃圾邮件
    增加你的流量