Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

简单化规则原理 复杂正则表达式

  正则表达式是JavaScript的一大亮点,利用它可以完整很多复杂的字符处理。但是复杂的逻辑需求对于正则表达式的书写是致命的,如果不把需求的逻辑分析到最简化就很难写出符合需求的正则表达式。这正是以前的文章中就有提到过的“简单化规则原理”。
  最近看到了一个正则表达式的问题让我想起了以前的另一个问题,当时我写了一篇关于正则表达式中使用逻辑与的文章说明了这个问题,但现在觉得这还不够。这回看到的是给数字加千位分隔符的问题的。但根据对千位分隔符的描述不同也能写出不同的正则表达式,所以更直接的问题就是如何用最简单的逻辑去描述千位分隔符。
  “从右到左每三位的左边插入一个逗号,最高位左边不加逗号”这样的语言描述非常清晰,但这句话中包含了一个逻辑与,因此在逻辑复杂度增加了。如果换成“从右到左每三位左边一位的右边插入逗号”这个描述看上去就会有些绕,但它略去了逻辑与,使得逻辑复杂度降低了。
  上面的第一个描述,可以写出这样的程序
"123456789".replace(/(?!^)(?=(?:...)+$)/g,",");   第二个描述可以写出这样的程序
"123456789".replace(/(.)(?=(?:...)+$)/g,"$1,");   把逻辑复杂度降到最低就是简单化规则原理,这主要是为了方便储存和容易记忆。它提供的是一种思维方式,用来把复杂的逻辑从另一个角度思考。这实际上是在对逻辑的一种压缩,但信息量是守恒的,当我们压缩逻辑时,信息密度就会增加。换言之,简单化规则原理就是让信息密度最大化。
  这在自然语言中就是用更少的文字描述更多的内容,在编程语言中就是用更少减少代码做更多的事情。但是这样的逻辑压缩在算法效率方面未必有优势,短代码未必是高效代码。jQuery的代码就非常简短,但是它在效率方面并不出众。就像文言文,虽然字数少,但是我们需要花更多的时间去理解它。
  上面两段代码的效率前者会稍高,而且前者还可以继续做效率优化 var i,t,r,s="123456789";

//代码1
r=/(?!^)(?=(?:...)+$)/g;
t=new Date;
for(i=0;i<1E5;i++)s.replace(r,",");
console.log(new Date-t);

//代码2
r=/(.)(?=(?:...)+$)/g;
t=new Date;
for(i=0;i<1E5;i++)s.replace(r,"$1,");
console.log(new Date-t);

//代码1的效率优化版
r=/(?!^)(?=(?:...)+$)(...)/g;
t=new Date;
for(i=0;i<1E5;i++)s.replace(r,",$1");
console.log(new Date-t);
     
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^