正则表达式之我见

  应博文周筠老师(@yeka52)之邀,简单说说我对正则表达式的一些想法。
  正则表达式这个提法,我最早是还在混CSDN论坛的时候听说的,大概02年前后吧,当时只觉得这是个不错的值得学习的一门技术,但具体有哪些用途,为什么值得学习,并没有很清晰的概念。直到后来正式参加工作,进入到软件开发这个行当,实际上手以后,才慢慢的有了自己的体会,尤其从05年开始全方位接触Linux后,正则几乎成为了日常工作中必不可缺的一部分。在很多语境下,正则就是文本处理的代名词。
  在国内的教育环境下成长起来的我们,对于自己不熟悉、不擅长的领域,很容易走极端:要么极端崇拜,把它看作神一样的存在;要么极端反感,把它当作垃圾,丢弃在角落里。两个极端的共同点,就是拒绝学习。我也经常犯这样的错。
  正则表达式,不管你喜欢不喜欢,正默默无闻的在计算机应用的各个领域发挥着实实在在的作用,就像空气和水,你不一定随时想到它的存在,但却无时不受着它的恩惠。它有它复杂的地方,也许初学起来会很枯燥很费劲,难以理解为什么要造出这么一个玩意儿。但当你真正掌握以后,它带来的生产力提升是十分巨大的,绝对值回票价。
  正则于文本的用途,核心在于以下几点:查找、定位、抽取、转换。任何需要我们对文本执行这些任务的场景,正则都有其用武之地。我无意面面俱到的介绍正则的所有细节和用法,我只站在一个普通程序员的立场,简单说说我日常工作中对正则的使用体会。我只强调一件事:正则可以很复杂,但不要一上来就追求"用其极",算是对初学者的一点小小建议。
  首先,作为程序员,我们时常会接到一些任务,类似要判断一个输入值是否为合法的邮箱地址咯,是否为国内手机号咯,是否是链接咯,是否是合法的15位或18位身份证号咯,等等。这些是再正常再直白不过的正则表达式用途。
  其次,如果你做Web开发,需要抓取页面,从中提取有价值的信息,比如所有图片,所有指向某个domain的链接;或者需要根据访问的URL,确定转发去的服务接口和参数,正则是天生的帮手。
  再次,如果你是做Java开发,用到XML,或者使用其他一些动态语言,IDE无法自动帮你重构,完成一些名称的更新时,你可能就需要依赖一些外部工具,或者至少是IDE内提供的查找/替换功能,这个时候,如果你懂正则,那么就会事半功倍。有时哪怕是IDE能够做的事,但因为代码库过于庞大,通过外部工具,如find/grep/awk/sed/vi,加上一些简单的正则,可以不必苦等IDE复杂而繁琐的加载、分析、索引、运算等过程。
  还有,如果你做运维或者查找问题,需要从海量的日志文件分析出有意义的pattern,通过正则的帮助,加上前一条提到的外部工具,你能够很方便的定位、抽取和转换,最终组合出足够精细的文本,通常是不用翻屏就能看到全部的简短文本,让你一眼就能明确问题所在。
  当然,我们偶尔也会想写点东西发表,不论是博客文章,论坛帖子,邮件列表还是正式的出版物,正则也能够帮我们过滤掉一些错误的拼写(尤其是大小写)和其他不符合要求的文本范式,在提交到网上或者发送给出版社编辑之前,自己先带上编辑的帽子做一些审校,就像我们提交代码给QA测试之前,自己在本机做一些单元测试,以确保我们的代码是可工作的。这是专业程序员的职业修养。
  正则的应用当然远不止这些,我只列举了对程序员这个特殊群体而言,时常遇到的一些需求,而这些需求我们通常都可以通过正则方便而优雅的应对。程序员每天面对最多的,不是别的,正是文本,代码也好,配置文件也好,日志也好,UNIX中各种命令的输出也好,都是文本,而处理文本,怎可以离开正则?掌握正则,除了可以辅助我们实现某些具体的特定的功能,比如输入值验证、URL转发等,无疑也是我们提升开发能力、缩短开发周期的重要途径。所以我认为,正则表达式是每个对自己负责的程序员都必须掌握的一门技术。不需要精通,也能大幅提高我们解决问题的效率,不做代码猴子,给自己留出更多的时间去享受生活,去拥抱更多、更有趣的冒险。

你可能感兴趣的:(技术杂绘,java,测试)