精通正则表达式(第3版)

分類: 图书,计算机/网络,程序设计,其他,
作者: (美)佛瑞德(Friedl,J.E.F.)著,余晟译
出 版 社: 电子工业出版社
出版时间: 2007-7-1字数: 732000版次: 3页数: 515印刷时间: 2007/07/01开本:印次:纸张: 胶版纸I S B N : 9787121046841包装: 平装编辑推荐
十年三版,再显王者风范,近30年开发经验的智慧结晶,深入理解正则表达式,彻底修炼基本功,全球第一本全面深入讲解正则表达式的经典巨著,《程序员》杂志技术主编孟岩鼎力推荐。
内容简介
随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。本书是讲解正则表达式的经典之作。本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了在Perl、Java、.NET、PHP中正则表达式的用法。
本书自第一版开始着力于教会读者 “以正则表达式来思考”,来让读者真正“精通”正则表达式。该版对PHP的相关内容、Java1.5和Java1.6的新特性作了可观的扩充讲解。任何有机会使用正则表达式的读者都将因本书而受益匪浅。
作者简介
Jeffrey E.F.Friedl生长于俄亥俄州Rootstown的乡村,小时候希望成为天文学家,直到有一天他发现了闲置在化学实验室角落里的TRS-80 Model I(装备了整整16KB RAM)。1980年他终于开始使用Unix(和正则表达式)。在肯特(Kent)大学和新罕布什尔(New Hampshire)大学分别获得计算机学士和硕士学位之后,他在日本京都工作了8年,为欧姆龙公司(Omron Corporation)进行核心开发,1997年迁居硅谷,在当时还不为人知的Yahoo!用正则表达式处理财经新闻和数据。2004年4月他偕妻儿返回京都。
Friedl的闲暇时间很充裕,这时候他喜欢与妻子Fumie和3岁的活蹦乱跳的儿子Anthony一起。他还喜欢拍摄遍布京都的美景,照片在他的blog上:http://regex.info/blog。
目录
前言
第1章正则表达式入门
解决实际问题
作为编程语言的正则表达式
以文件名做类比
以语言做类比
正则表达式的思维框架
对于有部分经验的读者
检索文本文件:Egrep
Egrep元字符
行的起始和结束
字符组
用点号匹配任意字符
多选结构
忽略大小写
单词分界符
小结
可选项元素
其他量词:重复出现
括号及反向引用
神奇的转义
基础知识拓展
语言的差异
正则表达式的目标
更多的例子
正则表达式术语汇总
改进现状
总结
一家之言
第2章入门示例拓展
关于这些例子
Perl简单入门
使用正则表达式匹配文本
向实用的程序前进
成功匹配的副作用
错综复杂的正则表达式
暂停片刻
使用正则表达式修改文本
例子:公函生成程序
举例:修整股票价格
自动的编辑操作
处理邮件的小工具
用环视功能为数值添加逗号
Text-to-HTML转换
回到单词重复问题
第3章正则表达式的特性和流派概览
在正则的世界中漫步
正则表达式的起源
最初印象
正则表达式的注意事项和处理方式
集成式处理
程序式处理和面向对象式处理
查找和替换
其他语言中的查找和替换
注意事项和处理方式:小结
字符串,字符编码和匹配模式
作为正则表达式的字符串
字符编码
Unicode
正则模式和匹配模式
常用的元字符和特性
第4章表达式的匹配原理
第5章正则表达式实用技巧
第6章打造高效正则表达式
第7章Perl
第8章Java
第9章NET
第10章PHP
索引
媒体评论
王森书评
千头万绪 : 学习多执行绪程序设计的好书
找对书,多执行绪不再避之唯恐不及
科学家对于人类大脑的运作方式,目前仍存在许多争议。但是许多经过科学实验的证据显示,人类的大脑是以平行的方式工作。即使如此,笔者不免想起,大学时期选修操作系统(Operation System)这门课时,当老师教到Task、Process、以及Thread,一群大学生才刚搞懂哲学家的吃饭问题,紧接着关于Thread的算法讨论,搞得同学们一阵千头万绪,纷纷中箭倒地。
从此,计算器相关科系的毕业生,避多执行绪唯恐不及,能够不用就不用,就算不得已一定要多执行绪一番,也不见得可以撰写出真正发挥出多执行绪优势的程序,大部分所见到的,都是存在着隐忧的程序代码。
Win32多执行绪应用程序开发。
过去,Win32应用程序当道的时候,要学习如何使用Win32 API所提供的多绪执行功能,Addison Wesley的《Multithreading Applications in Win32:The Complete Guide to Threads》这本书绝对是众多Windows程序设计专家推荐的好书,这本书在1997年8月的时候,曾经由侯俊杰(侯捷)老师翻译,碁峰出版《Win32 多绪程序设计》,以侯老师在写译上的高质量要求,这本书自然是当时国内Windows程序设计师手头上必备的一本书。
8年过去了,现在的系统开发主流是Web应用程序,不再是Windows应用程序,这本书也绝版了,但是其参考性,并没有因此而降低,如果您的工作还是需要在Win32平台上开发多执行绪应用程序,想尽办法也该试着把这本书找出来吧。
Unix多执行绪应用程序开发
相较于Win32平台,Unix为另外一个操作系统的主流,Unix服务器通常肩负着关键性任务,尤其在这个Internet的时代,躲在背后苦命工作的服务器,十之八九采用Unix。即使服务器等级的机器有再多的处理器和内存,仍然需要善用多执行绪的服务器软件,才能充分发挥其效用。因此,在Unix上开发多执行绪软件,同样是个重要议题。
然而,Unix只是一个统称,其分支体系之复杂,非专家无法区分出Linux、FreeBSD、Solaris、Mac OS X这些操作系统之间的亲戚关系。要在这些”类UNIX”的平台上开发一个可以跨平台的应用程序,绝对是一件非常困难且精细的事情,所以制定了POSIX Thread(简称PThread)标准,藉此降低工程师的负担,Addison Wesley《Programming with POSIX Threads》这本书,也成为Unix上撰写多执行绪程序的必备参考书。
除此之外,O’Reilly的《Pthreads Programming》也是另外一本不错的参考书,这本书也曾在1997年11月,由一家早已不存在的『松格信息』出版过中译本。现在如果有人想要买一本来保存,可能真的得到光华商场的地下一楼,中古书店一间间慢慢地找,才有可能找得到。
虽然《Pthreads Programming》的评价没有《Programming with POSIX Threads》来的好,但是作为一本入门书,笔者比较推荐《Pthreads Programming》,除了因为这本书废话不多,一开始就切入主题之外,有更大的原因是因为,读者只需要懂一些简单的Unix 程序开发,就可以很快学会如何使用PThread。这两本书,即使出版年份距今已有8年以上,对于目前还需要在Unix上开发多执行绪应用程序的人,一样具有非常高的参考价值。
书摘插图
译者序
《精通正则表达式 第3版》(即Mastering Regular Expression 3rd Edition)是一本好书。
我还记得,自己刚开始工作时,就遇到了关于正则表达式的问题(从此被逼上梁山):若从文本中抽取E-mail地址,还可以用字符串来查找(先定位到@,然后向两端查找),若要抽取URL,简单的文本查找就无能为力了。正当我一筹莫展之时,项目经理说:“可以用正则表达式,去网上找找资料吧。”抱着这根救命稻草,我搜索了之前只是听说过名字的正则表达式的资料,并打印了java.util.regex(开发用的Java)的文档来看。摸索了半天,我的感觉就是,这玩意儿,真神奇,真复杂,真好用。
此后,我用到正则表达式的地方越来越多,也越来越感觉到它的重要,然而使用起来感觉总是捉襟见肘。当时是夏天,北京非常热,我决定下班之后不再着急赶车回家,而是在公司安心看看技术文档,于是邂逅了这本Mastering Regular Expression。该书原文是相当通畅易懂的,看完全书大概花了我一周的业余时间,之后便如拨云见日,感觉别有洞天——原来正则表达式可以这样用,真是奇妙,真是令人拍案叫绝。
此后我运用正则表达式便不用再看什么资料了,充其量就是查查语言的具体文档,表达式的基本模型和思路,完全是在阅读本书时确立的。也正是因为细心阅读过本书,所以有时我能以正则表达式解决某些复杂的问题。我的朋友郝培强(Tinyfool,昵称Tiny)曾问过我这样一个正则表达式的问题:在Apache服务器的Rewrite规则中,要求以一个正则表达式匹配“除两个特定子域名之外的所有其他子域名”,其他人的办法都无法满足要求:要么只能匹配这两个特定的子域名,要么必须依赖程序分支才能进行判断。其实这个问题,是可以用一个正则表达式匹配的。事后,Tiny说,看来,会用正则的人很多,但真正懂得正则的人很少。现实情况也确实如此,就我所见,不少同仁对正则表达式的运用,不外乎从网上找一些现成的表达式,套用在自己的程序中,但对到底该用几个反斜线转义,转义是在字符串级别还是表达式级别进行的,捕获型括号是否必须,表达式的效率如何,等等问题,往往都是一知半解,甚至毫无概念,在Tiny的问题面前,更是束手无策,一筹莫展。
就我个人来说,我所掌握的正则表达式的知识,绝大多数来自本书。正是依靠这些知识,我几乎能以正则表达式进行自己期望的任何文本处理,所以我相信,能够耐心读完这本书的读者,一定能深入正则表达式的世界,若再加以练习和思考,就能熟练地依靠它解决各种复杂的问题(其中就包括类似Tiny的问题了)。
去年,通过霍炬(Virushuo)的介绍,我参加了博文视点的试译活动,很幸运地获得了翻译本书的机会。有机会与大家分享这样一本好书,我深感荣幸。500多页的书,拖拖拉拉,也花了半年多的时间。虽然之前读过原著,积累了一些运用正则表达式的经验,也翻译过数十万字的资料,但要尽可能准确、贴切地传达原文的阅读感觉,我仍感颇费心力。部分译文在确认理解原文的基础上,要以符合中文习惯的方式加以表述仍然颇费周折(例如,直译的“正则表达式确实容许出现这种错误”,原文的意思是“这样的错误超出了正则表达式的能力”,最后修改为“出现这样的错误,不能怪正则表达式”或“这样的问题,错不在正则表达式”)。另有部分词语,虽可译为中文,但为保证阅读的流畅,没有翻译(例如,“它包含特殊和一般两个部分,特殊部分之所以是特殊的,原因在于……”,此处special和normal是专指,故翻译为“它包含special和normal两个部分,special部分之所以得名,原因在于……”),这样的处理,相信不会影响读者的理解。
在本书翻译结束之际,我首先要感谢霍炬,他的引荐让我获得了翻译这本书的机会;还要感谢博文视点的周筠老师,她谨慎严格的工作态度,时刻提醒我不能马虎对待这本经典之作;还有本书的责编晓菲,她为本书的编辑和校对做了大量细致而深入的工作。
另外我还要感谢东北师范大学文学院的王确老师,在我求学期间,王老师给予我诸多指点,离校时间愈长,愈是怀念和庆幸那段经历,可以说,没有与他的相识,便没有我的今天。
最后我还要感谢我的女友侯芳,她的陪伴,让我能够保持好的心情,全身心地投入到翻译中去。
本书是讲授正则表达式的经典之作,翻译过程中,我虽力求把握原文,语言通畅,但翻译中的错误,或许是在所难免的,对此本人愿负全部责任。希望广大读者发现错误能及时与我们联系,以便再版时修正,或是以勘误的形式公布出来,以惠及其他读者。如果读者有任何想法或建议,也欢迎给我写信,我的邮件地址是:yusheng.regex@gmail.com。
如今正则表达式已经成为几乎所有主流编程语言中的必备元素:Java、Perl、Python、PHP、Ruby……莫不如此,甚至功能稍强大一些的文本编辑工具,都支持正则表达式。尤其是在Web兴起之后,开发任务中的一大部分甚至全部,都是对字符串的处理。相比简单的字符串比较、查找、替换,正则表达式提供了强大得多的处理能力(最重要的是,它能够处理“符合某种抽象模式”的字符串,而不是固化的、具体的字符串)。熟练运用它们,能够节省大量的开发时间,甚至解决一些之前看来是mission impossible的问题。
本书是讲解正则表达式的经典之作。其他介绍正则表达式的资料,往往局限于具体的语法和函数的讲解,于语法细节处着墨太多,忽略了正则表达式本身。这样,读者虽然对关于正则表达式的具体规定有所了解,但终究是只见树木不见森林,遇上复杂的情况,往往束手无策,举步维艰。而本书自第1版开始便着力于教会读者“以正则表达式来思考(think regular expression)”,向读者讲授正则表达式的精髓(正则表达式的各种流派、匹配原理、优化原则,等等),而不拘泥于具体的规定和形式。了解这些精髓,再辅以具体操作的文档,读者便可做到“胸中有丘壑,下笔如有神”;即便问题无法以正则表达式来解决,读者也能很快作出判断,而不必盲目尝试,徒费工夫。
不了解正则表达式的读者,可循序渐进,依次阅读各章,即便之前完全未接触过正则表达式,读过前两章,也能在心中描绘出概略的图谱。第3、4、5、6章是本书的重点,也是核心价值所在,它们分别介绍了正则表达式的特性和流派、匹配原理、实用诀窍以及调校措施。这样的知识与具体语言无关,适用于几乎所有的语言和工具(当然,如果使用DFA引擎,第6章的价值要打些折扣),所谓“大象无形”,便是如此。读者如能仔细研读,悉心揣摩,之后解决各种问题时,必定获益匪浅。第7、8、9、10章分别讲解了Perl、Java、.NET、PHP中正则表达式的用法,看来类似参考手册,其实是对前面4章知识的包装,将抽象的知识辅以具体的语言规定,以具体形式表现出来。所以,心急的读者,在阅读这些章节之前,最好先通读第3、4、5、6章,以便更好地理解其中的逻辑和思路。
相信仔细阅读完本书的读者,定会有登堂入室的感觉。不但能见识到正则表达式各种令人眼花缭乱的特性,更能够深入了解表达式、匹配、引擎背后的原理,从而写出复杂、神奇而又高效的正则表达式,快速地解决工作中的各种问题。
余晟
2007年6月于北京