您的位置:首页 > Web前端 > JavaScript

Javascript日期处理中正则的应用

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

这段时间做日期的处理,需要用到日期的计算,包括加减什么的,于是做了一个公用处理的扩展,叫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.

  注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/

本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: