正则表达式是一个非常非常非常强大的语言,这里连续用了三个非常,我觉得还不够,它娇小但却功能强大,绝对的浓缩的就是精华,我发现我越来越喜欢它了。
这段时间做日期的处理,需要用到日期的计算,包括加减什么的,于是做了一个公用处理的扩展,叫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/],原文链接:http://iove.net/archives/1071.html,网站转载请注明来源于涂雅并保留原文链接,否则视为侵权。
嗯,或者你也可以收听我的微博,腾讯微博(主要用这个,其他的看我的个人介绍)
我写博客常常出现错别字,常常错得还很离谱,有时候我自己看了第二遍都骂我自个儿,但我又不习惯重复审查,纠结啊...各位看到啥错别字或者不明白的地方,请给我留言指出来,感谢感谢。
gmail.com
最新评论