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中表达式的函数,先看这个:
这段代码可以把一个日期处理表达式如-10d分解成一个结构体返回,返回的结构大概是这样:
是不是很意思,可是,有什么问题吗?好像没有问题,代码能完全正常工作,还使用了正则,看上去还挺高级的,返回结果完全正常,效率也不会低到哪里去。还需要改正吗?当然需要,一个优秀的程序员应该不停改善自己的代码,只有更好,没有最好。上面的代码为什么我们不能简短一些呢?wow,试一下,或者有更好的办法,来看下一个代码:
对比一下,第一段代码是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/
这段时间做日期的处理,需要用到日期的计算,包括加减什么的,于是做了一个公用处理的扩展,叫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/
相关文章推荐
- JavaScript日期格式化与正则表达式RegExp.$的用法
- JAVA基础应用: 处理Java中的日期问题
- 正则表达式在javascript中应用
- javascript 时间日期处理相加、减操作方法
- 正则应用之——日期正则表达式
- 正则表达式在JavaScript应用
- 正则应用之 日期正则表达式
- JavaScript:学习笔记(3)——正则表达式的应用
- 正则应用之——日期正则表达式
- 分享5个最佳的Javascript日期处理类库
- JavaScript日期处理公共函数
- 正则处理日期字符串日期单数前面补齐0
- javascript日期处理库-Datejs.js
- JavaScript处理cookie和session问题已经日期问题
- 5个最佳的Javascript日期处理类库分享
- javascript日期处理函数,性能优化批处理
- 自己整理的一个javascript日期处理函数
- javascript中处理时间戳为日期格式的方法
- JavaScript正则表达式之multiline属性的应用
- Javascript String 正则表达式应用