自学编程难不难系列 之 正则表达式 ..
作者: 一了 <1liao3@funlang.org>
日期: 2016-05-06
点进来看的现在应该都知道上一篇(自学编程难不难系列 之 C++)所说的重要技术到底是什么了, 但是我们先不着急说这个, 咱先说一个故事.
话说当年进软件公司做的第一个项目是国家财政部的工资统发软件, 这个软件有一个地方需要公式, 有一个公式编辑器, 变量则是数据库字段(软件里叫科目), 是用下拉的方式插入科目(中文的), 然后用户可以随意编辑, 加减乘除四则运算之类的, 允许套括号, 随便嵌套, 但是要符合语法, 最后通过检查的公式保存起来, 工资就照这个来计算. 当时我也没多想, 就大致分成这么几个步骤搞定: 1. 先扫描, 检查中文科目有没有被篡改, 替换回英文(记得是拼音, 他们爱这么设计)字段名; 2. 然后检查公式语法是不是合法, 公式中除了英文(拼音)变量名, 剩下的除了运算符号(包括括号), 就是数字; 3. 语法检查通过之后构造一个特定的 SQL Select 去数据库跑一下, 看看是否出错; 4. 如果返回的结果是数字, 公式成立...这里面最麻烦的是第2步, 是一个公式解析器, 相当麻烦, 写了不少代码.
扯这么多, 到底想说啥呢, 是不是跑题了? 其实跟本文主旨还是有关的, 就是这个东西可以用正则表达式来处理, 尤其是第二步, 现在的我可以用一条正则表达式就处理了, 各位不妨自己思考一下该怎么写这条正则表达式. 我在这里想挑战一下各位, 相信没几个人能写的出来, 即使有人写出来, 也大概率比我的差. 在文章末尾我会附上答案, 我建议先不要着急看答案, 会的人也思考一下, 能不能写的更好, 不会的也先自己思考一下, 这样才会有进步.
实际上我在02年做这个事情的时候, 完全不懂正则表达式, 这得归功于几年后, 我遇上了我的技术搭档, 也是我的商业合伙人. 他是个顶级高手, 而且人品超级棒, 我从他那里学到了很多很多. 实际上原先我也多少知道啥是正则表达式, 但是完全不知道这个玩意儿能干啥用. 一个你不知道能干啥用的东西, 确实很难学会, 我那时就是这样的状态. 后来看到搭档怎么用这个神器, 在他的启发下, 一鼓作气就学会了, 进步神速, 毫无障碍. 而且我敢小吹一下, 在正则表达式上面我算得上是顶级水平. 我对其他语言(正则表达式也是语言)可完全没有这个信心. 后来我们搞的 Nuva 语言的前身----一个模板语言, 其语法解析器实际上是正则表达式, 有好几K那么大, 虽然比我写的最大的 SQL 要小(那个有几十K), 但是复杂性大了很多.
一个神器, 你知道怎么用, 他就能发挥极大的效用, 这个比拿来判断质数有意义的多了. 反过来, 学习任何技术或者神器, 也还是要从完成实际任务出发比较好, 当然了解原理也是一部分. 我给自学初学者的建议就是就用一门简单的语言(如 Fun 语言, 这个真不是吹, Fun 语言比绝大多数语言要简单, 下载一个完整的运行环境包括 IDE 才不到 1M)来完成几项简单而又逐步深入的任务, 如 1. 打印一个美观的九九乘法表; 2. 数字因式分解; 3. 数字转为中文表示法(包括大写)...等等... 当然了, 也少不了要写一个无漏洞的二分查找... 这几样完成了, 编程还是难事么...
好了, 该是公布答案的时候了, 不过我还是要卖个关子, 你们说答案↓在哪里呢?
找到答案↑之后, 你会看到我写了好几种答案, 而且为了看清楚, 我还特意做了格式化处理...