王朝网络
分享
 
 
 

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

王朝导购·作者佚名
 
精通正则表达式(第3版)(Mastering Regular Expressions)  点此进入淘宝搜索页搜索
  特别声明:本站仅为商品信息简介,并不出售商品,您可点击文中链接进入淘宝网搜索页搜索该商品,有任何问题请与具体淘宝商家联系。
  参考价格: 点此进入淘宝搜索页搜索
  分类: 图书,计算机与互联网,计算机科学理论,计算机基础理论,
  品牌: 佛瑞德

基本信息·出版社:电子工业出版社

·页码:515 页

·出版日期:2007年

·ISBN:9787121046841

·条形码:9787121046841

·包装版本:2007年7月第3版

·装帧:平装

·开本:16开

·外文书名:Mastering Regular Expressions

产品信息有问题吗?请帮我们更新产品信息。

内容简介《精通正则表达式》(第3版)是讲解正则表达式的经典之作。本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。

本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者真正“精通”正则表达式。该版对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一起。他还喜欢拍摄遍布京都的美景。

媒体推荐译者序

译者序

《精通正则表达式 第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月于北京

前言

前言

Preface

本书关注的是一种强大的工具——“正则表达式”。它将教会读者如何使用正则表达式解决各种问题,以及如何充分使用支持正则表达式的工具和语言。许多关于正则表达式的文档都没有介绍这种工具的能力,而本书的目的正是让读者“精通”正则表达式。

许多种工具都支持正则表达式(文本编辑器、文字处理软件、系统工具、数据库引擎,等等),不过,要想充分挖掘正则表达式的能力,还是应当将它作为编辑语言的一部分。例如Java、JScript、Visual Basic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事实上,在一些用上述语言编写的程序中,正则表达式扮演了极其重要的角色。

正则表达式能够得到众多语言和工具的支持是有原因的:它们极其有用。从较低的层面上来说,正则表达式描述的是一串文本(a chunk of text)的特征。读者可以用它来验证用户输入的数据,或者也可以用它来检索大量的文本。从较高的层面上来说,正则表达式容许用户掌控他们自己的数据——控制这些数据,让他们为自己服务。掌握正则表达式,就是掌握自己的数据。

本书的价值

The Need for This Book

本书的第1 版写于1996年,以满足当时存在的需求。那时还没有关于正则表达式的详尽文档,所以它的大部分能力还没有被发掘出来。正则表达式文档倒是存在,但它们都立足于“低层次视角”。我认为,那种情况就好像是教一些人英文字母,然后就指望他们会说话。

第2 版与第1 版间隔了五年半的时间,这期间,互联网迅速流行起来,正则表达式的形式也有了极大的扩张,这或许并不是巧合。几乎所有工具软件和程序语言支持的正则表达式也变得更加强大和易于使用。Perl、Python、Tcl、Java和Visual Basic都提供了新的正则支持。新出现的支持内建正则表达式的语言,例如PHP、Ruby、C#,也已经发展壮大,流行开来。在这段时间里,本书的核心——如何真正理解正则表达式,以及如何使用正则表达式——仍然保持着它的重要性和参考价值。

不过,第1版已经逐渐脱离了时代,必须加以修订,才能适应新的语言和特性,也才能对应正则表达式在互联网世界中越来越重要的地位。第2 版出版于2002年,这一年的里程碑是java.util.regex、Microsoft .NET Framework和Perl 5.8的诞生。第2 版全面覆盖了这些内容。关于第2 版,我唯一的遗憾就是,它没有提及PHP。自第2 版诞生以来的4 年里,PHP的重要性一直在增加,所以,弥补这一缺憾是非常迫切的。

第3 版在前面的章节中增加了PHP的相关内容,并专门为理解和应用PHP的正则表达式增加了一章全新的内容。另外,该版对Java的章节也进行了修订,做了可观的扩充,反映了Java1.5和Java1.6的新特性。

目标读者

Intended Audience

任何有机会使用正则表达式的人,都会对本书感兴趣。如果您还不了解正则表达式能提供的强大功能,这本书展示的全新世界将会让您受益匪浅。即使您认为自己已经是掌握正则表达式的高手了,这本书也能够深化您的认识。第1 版面世后,我时常会收到读者的电子邮件反映说“读这本书之前,我以为自己了解正则表达式,但现在我才真正了解”。

以与文本打交道为工作(如Web开发)的程序员将会发现,这本书绝对称得上是座金矿,因为其中蕴藏了各种细节、暗示、讲解,以及能够立刻投入到实用中的知识。在其他任何地方都难以找到这样丰富的细节。

正则表达式是一种思想——各种工具以各种方式(数目远远超过本书的列举)来实现它。如果读者理解了正则表达式的基本思想,掌握某种特殊的实现就是易如反掌的事情。本书关注的就是这种思想,所以其中的许多知识并不受例子中所用的工具软件和语言的束缚。

如何阅读

How to Read This Book

这本书既是教程,又是参考手册,还可以当故事看,这取决于读者的阅读方式。熟悉正则表达式的读者可能会觉得,这本书马上就能当作一本详细的参考手册,读者可以直接跳到自己需要的章节。不过,我并不鼓励这样做。

要想充分利用这本书,可以把前6 章作为故事来读。我发现,某些思维习惯和思维方式的确有助于完整的理解,不过最好还是从这几章的讲解中学习它们,而不是仅仅记住其中的几张列表。

故事是这样的,前6 章是后面4 章——包括Perl、Java、.NET和PHP——的基础。为了帮助读者理解每一部分,我交叉使用各章的知识,为了提供尽可能方便的索引,我投入了大量的精力(全书中有超过1 200处交叉引用,它们用符号加页码的形式标注)。

在读完整个故事以前,最好不要把本书作为参考手册。在开始阅读之前,读者可以参考其中的表格,例如第92页的图表,想象它代表了需要掌握的相关信息。但是,还有大量背景信息没有包含在图表中,而是隐藏在故事里。读者阅读完整个故事之后,会对这些问题有个清晰的概念,哪些能够记起来,哪些需要温习。

组织结构

Organization

全书共10 章,可以从逻辑上粗略地分为三类,下面是略图:

导引

第1章:介绍正则表达式的基本概念。

第2章:考察利用正则表达式进行文本处理的过程。

第3章:提供对于特性和工具软件的概述以及简史。

细节

第4章:揭示了正则表达式的工作原理的细节。

第5章:利用第4章的知识,继续学习各种例子。

第6章:详细讨论效率问题。

特定工具的知识

第7章:详细讲解Perl的正则表达式。

第8章:讲解Sun提供的java.util.regex包。

第9章:讲解.NET的语言中立的正则表达式包。

第10章:讲解PHP中提供正则功能的preg套件

导引部分会把完全的门外汉变成“对问题有感觉”的新手。对正则表达式有一定经验的读者完全可以快速翻阅这些章节,不过,即使是对于相当有经验的读者来说,我仍然要特别推荐第3章。

第1章,正则表达式入门,是为完全的门外汉准备的。我以应用相当广泛的程序egrep为例,介绍正则表达式,我也提供了我的视角:如何“理解”正则表达式,来为后面章节所包括的高级概念打下坚实的基础。即使是有经验的读者,浏览本章也会有所收获。

第2章,入门示例拓展,考查了支持正则表达式的程序设计语言的真实文本处理过程。附加的示例提供了后面章节详细讨论的基础,也展示了高级正则表达式调校背后的重要思考过程。为了让读者学会“正则表达式的套路”,这章出现了一个复杂问题,并讲解了两种全然不相关的工具如何分别通过正则表达式来解决它。

第3章,正则表达式的特性和流派概览,提供了当前经常使用的工具的多种正则表达式的概览。因为历史的混乱,当前常用的正则表达式的类型可能差异巨大。此章同时介绍了正则表达式以及使用正则表达式的工具的历史和演化历程。本章末尾也提供了“高级话题引导”。此引导是读者学习此后高级内容的路线图。

细节

The Details

了解了基础知识之后,读者需要弄明白“如何使用”及“这么做的原因”。就像“授人以渔”的典故一样,真正懂得正则表达式的读者,能够在任何时间、任何地点应用关于它的知识。

第4章,表达式的匹配原理,循序渐进地导入本书的核心。它从实践的角度出发,考察了正则引擎真实工作的重要的内在机制。懂得正则表达式如何处理工作细节,对读者掌握它们大有裨益。

第5章,正则表达式实用技巧,教育读者在高层次和实际的运用中应用知识。这一章会详细讲解常见(但复杂)的问题,目的在于拓展和深化读者对于正则表达式的认识。

第6章,打造高效正则表达式,考察真实生活中大多数程序设计语言提供的正则表达式的高效结果。本章运用第4章和第5章详细讲解的知识,来开发引擎的能力,并避免其中的缺陷。

特定工具的知识

Tool-Specific Information

学习完第4、5、6章的读者,不太需要知道特定的实现。不过,我还是用了4个整章来讲解4种流行的语言。

第7章,Perl,详细讲解了Perl的正则表达式,Perl大概是目前最流行的主要的正则表达式编程语言。在Perl中,与正则表达式相关的操作符只有四个,但它们组合出的选项和特殊情形带来了大量的程序选项——同时还有陷阱。对没有经验的开发人员来说,这种极其丰富的选项能够让他们迅速从概念转向程序,当然也可能是雷场。本章的详细介绍有助于给读者指出一条光明大路。

语言的标准部分。本章主要关注的是Java 1.5,但也提及了它与Java 1.4.2和Java 1.6的差别。

第9章,.NET,是微软尚未提供的.NET正则表达式库的文档。无论使用VB.NET、C#、C++、Jscript、VBScript、ECMAScript还是使用.NET组件的其他语言,本章都提供了详细内容,让读者能够充分利用.NET的正则表达式。

第10章,PHP,简要介绍了PHP内嵌的多个正则引擎,并详细介绍了preg正则表达式套件(regex engine)的类型和API,这些是由PCRE正则表达式库提供的。

体例说明

Typographical Conventions

在进行(或者谈论)详细的和复杂的文本处理时,保持精确性是很重要的。差一个空格字符,可能导致截然不同的结果,所以我会在本书中使用下面的惯例:

正则表达式以「this」的形式出现。两端的符号表示“里面有一个正则表达式”,而正则表达式文字(例如用来检索的表达式)以‘this’的形式出现。有时候,省略两端的符号和单引号也不会造成歧义,此时我会省略它们。同样,屏幕截图通常以原来的样子出现,而不会用到上面两种符号。

在文字文本和表达式内部的省略号会被特别标出。例如,[…]表示一对尖括号,之间的内容无关紧要,而[…]表示一对尖括号,其中包含三个句点。

如果没有明确数字,可能很难判断“a b”之间有多少空格,所以出现在正则表达式和文字文本中的空格以“?”表示。这样“a????b”就清楚多了。

我使用可见的制表符,换行符和回车字符:

空格字符

制表符

换行符

回车字符

有时候,我会使用下画线或有色背景高亮标注文字文本或正则表达式的一部分。下面这句话中,下画线的部分表示表达式真正匹配的部分:

Because 「cat」 matches ‘It?indicates?your?cat?is…’instead of the word ‘cat’, we realize...

这个例子中,下画线的部分高亮标记了表达式中添加的字符:

To make this useful, we can wrap 「Subject|Date」 with parentheses, and append a colon and a space. This yields 「(Subject|Date):?」

本书包含了大量的细节和例子,所以我设置了超过1 200处的交叉引用,帮助读者理解。它们通常表示为“?123”,意思是“请参阅第123页”。举个例子:“…的说明在表8-2中(?367)”。

练习

Exercises

有时候我会问个问题,帮助读者理解正在讲解的概念,尤其是在前几章这种问题更多。它们并不是摆设,我希望读者在继续阅读之前认真想想。请记住我的话,不要忽略它们的重要意义,本书中这样的问题并不多。它们可以当作自我测试题:如果不是几句话就能说明白的问题,最好是在复习相关章节之后再继续阅读。

为了避免读者直接看到问题的答案,我使用了一点技巧:问题的答案都必须翻页才能看到。通常你必须翻过一页才能看到标着?的答案。这样答案在你思考问题的时候没法直接看到,但又很容易获得。

链接、代码、勘误及联系方式

Links, Code, Errata, and Contacts

写第1 版时,我发现修改书本上的URL,保持与实际一致是件很费工夫的事情,所以,我没有在书后罗列一个URL附录,而是提供统一的地址:

http://regex.info

在这里你可以找到正则表达式相关的链接,书中的所有代码,可检索的索引以及其他资源。本书也可能存在错误?,所以我提供了勘误。

如果你找到书中的错误,或者仅仅是希望给我写几句话,请写邮件到:jfriedl@regex.info。

我们已尽力核验本书所提供的信息,尽管如此,仍不能保证本书完全没有瑕疵,而网络世界的变化之快,也使得本书永不过时的保证成为不可能。如果读者发现本书内容上的错误,不管是赘字、错字、语意不清,甚至是技术错误,我们都竭诚虚心接受读者指教。如果您有任何问题,请按照以下的联系方式与我们联系。

奥莱理软件(北京)有限公司

北京市 海淀区 知春路49号 希格玛公寓B座809室

邮政编码:100080

网页:http://www.oreilly.com.cn

E-mail:info@mail.oreilly.com.cn

与本书有关的在线信息(包括勘误、范例程序、相关链接)如下所示。

http://www.oreilly.com/catalog/regex3/(原书)

http://www.oreilly.com.cn/book.php?bn=0-596-52812-4(中文版)

博文视点资讯有限公司(武汉分部)

湖北省 武汉市 洪山区 邮科院路特1号 湖北信息产业科技大厦1406室

邮政编码:430074

电话:(027)87690813 传真:(027)87690813转817

网页:http://bv.csdn.net

读者服务信箱:

sheguang@broadview.com.cn(读者信箱)

broadvieweditor@gmail.com (投稿信箱)

亚马逊书评

Mastering Regular Expressions, Third Edition Rating:

2006-11-26 21:02:26 Frederick J Eccher Jr [Reply | View]

Mastering Regular Expressions, Third Edition

By Jeffrey E. F. Friedl

Third Edition August 2006

Pages: 542

Series: Adobe Developer Library

ISBN: 0-596-52812-4

Description

Written in the lucid, entertaining tone that makes a complex, dry topic become crystal-clear to programmers, and sprinkled with solutions to complex real-world problems, Mastering Regular Expressions, Third Edition offers a wealth of information that you can put to immediate use.

全书行文清晰而轻松,清晰透彻地向程序员讲解复杂而枯燥的话题,还包含了真实开发中复杂问题的解法。《精通正则表达式(第3版)》提供了大量极有价值的知识,可以直接拿来使用。

The description above is quite an understatement. Even the full description does not do this book justice. Mastering Regular Expressions, Third Edition is almost a classic and should be on your bookshelf, chained down. If your programming friends, coworkers, or enemies try to borrow this book, beware. It takes quite a while to get it back, even bent, spindled and mutilated so you might not want it back [yeah that was actually tried]. You might try a rule about using it at your desk, but that did not work for me either.

上文的评价其实很保守。对于这本书,用整篇书评都用来夸赞都不为过。《精通正则表达式(第3版)》就是一本经典之作,应该放在你的书架上,认真摆好。如果你的朋友、同事或是对手想要借阅,一定得小心。因为要回来得花很多工夫,甚至最后“经过许多年”回到你手中时,书已经卷角、开线或者残缺,你已经不想要了。最好是立个规矩,这本书就摆在书桌上,但这对我同样无效。

My experience agreed with almost everything written, except that I do not have the in depth use of RegEx the author clearly has. I wish I was on the same page with him in experience with RegEx. I started with RegEx in college in the early 90s and remember six projects that I had to do that could have been much easier with this book. My programming experience used RegEx on occasion but not with the power explained in this book. I appreciate the detailed and thorough comparisons of the languages. The only word I really missed in the INDEX and Table of Contents was: SECURITY. Using RegEx to make sure security issues are properly handled would really help many programmers and developers.

我的经验与书中的大多数内容一致,只是我对正则表达式的使用不如作者那样精深。我希望自己关于正则表达式的经验能和作者一样丰富。我最早接触正则表达式是20世纪90年代早期,在学校里,我记得要完成6个项目,如果当时有这本书,就好办多了。我在开发中偶尔会用到正则表达式,但没有用到书中讲解的那些强大功能。我对语言之间详尽而彻底的比较很感兴趣。我没能在索引和目录中看到的唯一内容是:安全。使用正则表达式确保安全事宜的妥善处理能对开发人员提供切实的帮助。

The topics start with a Preface, then moves to Introduction to Regular Expressions, then Extended Introductory Example, then Overview of Regular Expression Features and Flavors, then The Mechanics of Expression Processing, then the Practical Regex Techniques, then Crafting an Efficient Expression, then Perl, Java, .NET, PHP, and finally the Index. Remember to read the Preface, it is very interesting. The author makes some points about how to read the book [the first six chapters] and how to THINK.

这本书以序言开头,然后是正则表达式导论,接下来是入门示例扩展,再介绍正则表达式特性和流派,正则表达式处理的原理,之后讲解使用正则表达式技巧,打造高效的正则表达式,最后是Perl, Java, .NET, PHP和索引。请不要略过序言,它非常有意思。在序言中,作者概要介绍了本书(前6章)的阅读方法以及如何正则表达式思考。

The 10 chapters are written very thoroughly. I like that about this book. Explanations of history and trivia are all over the place but are written like a story and easy to read. The figures are good and useful in the explanation of the concepts. The code is usually more than a few lines. This is a more complicated book and requires more expressive code examples.

全部10章都写得很用心。我喜欢这一点。关于历史和其它小故事的讲解随处可见,以讲故事的方式写出来,便于阅读。所用的图表很适合讲解概念。代码通常不只几行,这本书的内容比较复杂,所以需要更多的代码才能说清楚。

The topics are useful and helpful in just about any language, including the more recent powerful languages like .NET and Java.

书中的内容对编程语言来说非常有用,包括近期出现的重量级语言,例如.NET和Java。

I thought the discriminations made about the different languages that use Regular Expressions went from general to specific in a hurry. Even so, the book is pretty long and needs to be digested in discrete chunks. No way to read this in one evening. There is no way to digest the concepts and comparisons very fast, at least for me. This is valuable knowledge worth your time to read and digest as thoroughly as possible.

我认为,在分别讲解不同的语言,实现从一般原理到特殊实现之间的过渡时有些急促。即便如此,这本书的篇幅还是很长,需要分成几个部分来吸收,而不能在一夜之间整个读完。也没有办法非常快地掌握其中的概念和比较,至少对我来说是如此。这些知识非常有价值,值得花时间细细阅读和思考。

The 540+ pages were easy to read and understand, partly told as a story. I read it in one week. There were a few typos and grammar errors, but not very many. The book is for someone who is a beginner or an expert and needs to know the specific times when one regular expression has even a slight benefit over another. More experienced people should look it over to make sure they are up to speed with this author.

超过540页的篇幅,其中一部分是在讲故事,阅读和理解起来并不困难。其中有些印刷和语法错误,但并不多。这本书适合于初学者,如果专家希望知道,为什么特定场合下某个表达式比另一个稍快一些,也应该阅读这本书。更有经验的人也应该留意这本书,确保他们没有比作者差太多。

I would give this book 5 out of 5 stars. Definitive!!!!!

毫无疑问,我给这本书最高的五星。

Frederick J Eccher Jr

MBA

M.S. Management of Information Systems

A.B. Psychology

B.A. Biology

President, Board of Directors, Saint Louis Visual Basic Users Group

rick@stlvbug.net

November 26, 2006

Good and enjoyed reading it Rating:

2006-11-15 19:13:43 Vikramaditya J [Reply | View]

读来惬意的好书

Regular Expressions is basically the same across most languages (some variations as how you use it and terminology differences too), whether it may be C#, Javascript, PHP, Ruby, Python, TCL, Perl, or JAVA. This is amazing and should be used as an hand book for students and beginning to intermediate developers. As the book is in third edition some basics of the programming languages are expected to be know by its readers. Overall its a good book and worth a reading.

无论是C#,Javascript,还是PHP,Ruby,Python,Tcl,Perl或Java,在大多数语言中,正则表达式都是相通的(可能在术语和用法上有些区别)。这本书精彩纷呈,应该成为初学者和中级开发人员的必备读物。阅读新推出的第3版,要求读者对书中使用的程序设计语言有基本了解。总的来说,这是本好书,值得一读。

Not a Reference! Everything you ever wanted to know about regex! Rating:

不仅仅是参考手册!而是正则表达式的百科全书!

2006-10-20 08:26:36 ismism [Reply | View]

As the author states, this is not a reference. It is everything you might ever want to know about regular expressions and then some. Well written, but a bit too epic for me, and if you aren't interested in perl - as I am not - there is a lot of information you just don't need (or want).

如作者所说,这本书并不是参考手册。它包含了你希望了解的,关于正则表达式的方方面面的知识。书写的很棒,但我觉得有点贪多求全,如果你对Perl不感兴趣——比如我就是,书中的许多内容是不必要的。

Read all reviews

________________________________________

Media reviews

"Classics are funny things, especially in the world of books. There are books that people say "should' be classics (I'll refrain from mentioning names to protect the pretentious) and then there are books that people are too busy actually using to get around to listing as classics. Mastering Regular Expressions, now in it's third edition, is in the second group. It's one of those books that you see on desks in computer departments the world over. This is a real "doers" book...Nail it to your desk unless you want to be constantly retrieving it from your co-workers. If I might be permitted a Spinal Tap reference, this one goes to eleven. If you ever use regular expressions, are thinking of using regular expressions or are in the same room as a regular expression, then you need this book. "

经典都是有来头的,尤其对书本来说,更是如此。有的书只是“应该”成为经典(为给那些自命不凡者留面子,名字就不提了);还有的书,因为随时都要用到,反而没时间列在经典书单上。已经出到第3版的《精通正则表达式》,就属于后者。在世界各地,你都能从开发部门的书桌上找到这本书。它属于真正的“实干家”…如果你不想三番五次找同事借,还是摆一本在自己的书架上吧。对我来说,推荐它就相当于推荐电影《摇滚万万岁》中的精彩一幕——These Go To 11。如果你用过正则表达式,或是希望用到,或是正在使用,那么,你需要这本书。

-- Simon P. Chappell, Slashdot.org

"In sum, let me just say that any developer who finds the need to manipulate text - whether it be scraping a web page, creating a report, importing data, or a hundred other applications, is going to need Regular Expressions. Jeffrey's book provides a complete and mature approach that is fresh, timely and detailed. I would recommend this book for any developer...Highly recommended!"

让我来说,就是一句话:任何人,只要处理文本——无论是抽取网页,生成报表,导入数据,或是其它任何应用——都需要用到正则表达式。Jeffery的这本书对此提供了完整而充分的讲解,引人入胜,紧跟时代,清晰明确。我向所有开发人员推荐这本书,强烈推荐!

-- Peter Bromberg, EggheadCafe.com

"This is an impressive book; it's easily the best book I've encountered on regular expressions."

这本书读来印象深刻,关于正则表达式的书里头,这是我见过的最容易读懂的一本。

-- George Woolley, Oakland Perl Mongers

Read all reviews

王森书评

千头万绪 : 学习多执行绪程序设计的好书

找对书,多执行绪不再避之唯恐不及

科学家对于人类大脑的运作方式,目前仍存在许多争议。但是许多经过科学实验的证据显示,人类的大脑是以平行的方式工作。即使如此,笔者不免想起,大学时期选修操作系统(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上开发多执行绪应用程序的人,一样具有非常高的参考价值。

在这个Java与.NET的时代

如本文前面所提,这是一个以Web应用程序为主的时代,而采用的开发平台,除了PHP以外,就属Java(Servlet/JSP)与.NET)ASP.NET)。就算要开发Unix平台上的应用程序,也开始有许多软件采用Java(AWT/SWING)开发,如果要开发Win32平台的应用程序,采用.NET(Windows Form)而舍弃MFC/ Delphi的开发者也不在少数。再这个时代,开发原生(native)应用程序变成了相对少数人才具有的技能。

不管是Java或.NET的Web应用程序开发人员,多半很少体会到多执行绪的好处,这是因为底层的Container已经充分利用多执行绪增加系统效能,而位于更上层的开发人员,虽然工作简单了,但是也无形间丧失了学习多执行绪的能力。相较之下,使用AWT/SWING或Windows Form的开发人员,非得好好学习多执行绪,才能做出有效率的使用者接口。

教导如何在.NET下使用多执行绪的书本来就不多,笔者推荐MANNING的《.NET Multithreading》,如果是采用Java开发,那么O'Reilly 的《Java Threads, 3/e》一样是不错的选择。《Java Threads, 3/e》已经由欧莱礼台湾分公司翻译成中文版《Java Threads 深度探讨》,虽然在翻译上,很多英文长句都没有经过断句,就直接翻成一串很长的中文句子,但是整体而言,质量仍然不错。

需要注意的是,《.NET Multithreading》非常适合新手入门,但《Java Threads, 3/e》并非如此,即使是第一章,采用的范例也稍嫌复杂,初学者可能看了老半天,仍会丈二金刚摸不着脑袋,笔者建议可以先读读Prentice Hall PTR的《Core Java 7/e, Volume2》里面关于Thread的章节,然后再回头看《Java Threads, 3/e》,如此才会效果显着。

由于J2SE 5.0之后,Java在Thread上不再只是简单的synchronized关键词配上wait() 、notify()、sleep()等函式,还引进了Concurrency Utility,读者在购买这两本畅销书时,别忘了购买最新讲解J2SE 5.0的版本,才能学习到Java在Thread上的最新变化。

Thread人人会用,巧妙各有不同

话说戏法人人会变,巧妙各有不同。独孤求败用木剑就能够与对手大战七天七夜,平常人拿了倚天剑屠龙刀,恐怕也只能任人宰割。虽然多执行绪程序在撰写上较为困难,但是本身并非一个非常大的议题。光知道每一种平台对多执行绪的支持并非难事,但是如何运用这些基本元素,充分利用多执行绪的优点,恐怕在上述的书籍中着墨不深。

多半的人会认为,J2SE 5.0以前的Java,虽然支持多执行绪,但却只是简单的支持,只有J2SE 5.0之后,Java对多执行绪的支持才算完整,也才能做到许多过去很难完成的工作。但是当您看了博硕文化出版的《Java Multithread Design Pattern-Java多执行绪与平行处理》之后,有这样观念的人就会发现既有观念大错特错。

这本原著以日文写成,专门探讨Java Thread的书籍,使用JDK 1.3为基础,即使没有J2SE 5.0所提供的花俏功能,一样变出许多戏法。尤其是第一章后面的练习题,就算许多自认懂得使用Java撰写多执行绪程序的人,或是为了认证考试熟读Java Thread的人,非常有可能在做完练习题之后,才发现自己原来根本不懂Java Thread。

笔者也是在读完这本书之后,才知道Thread的世界原来别有一番天地,不只是教科书上那些枯燥的算法。虽然最近电视上常看到一堆抗议日本的游行与相关新闻,不过,笔者相信『不以人废言』,才能学到更多知识,眼界也才能更开拓。 (2005-09-11 18:43:49.0) Permalink Comments [1]

THURSDAY SEPTEMBER 08, 2005

基本Java手机程序学会了,接下来看什么书? 三本强化J2ME设计功力的好书

从2000年SUN推出KJava至今,Java手机程序的发展,已经迈向第五个年头了。您一定会发现,现在市面上的手机,不管高阶或低阶,支持Java就像手机一定要支持收发简讯一样理所当然。Java随着手机普及率的增加,理所当然地成为最广泛的目的平台。可是,相较于其它技术,教导开发人员如何开发Java手机程序的书,并没有因为这个平台越来越广泛而变多。目前市面上讲述Java手机程序设计的书,十之八九讲述基本概念。『我已经有了基本的Java手机开发能力,接下来我要看哪些书,让我这方面的能力更进一步呢?』这是许多开发人员最常在公开论坛询问的问题。

要回答这个问题,可以从两个方面来思考,首先是手机应用程序发展趋势这个面向,另一个面向则是手机平台的不一致性。我们先就手机应用程序的发展趋势来看。

即使目前手机内建的处理器运算能力已经高于几年前的个人计算机,联机速度也比过去还要快,但是手机永远是手机,在目前的手机设计无法突破之前,手机永远只能有一个无法满足人类视觉需求的小屏幕,键盘上的按钮永远比需求少一个,更无法使用鼠标来操控。这一点大大地限制了手机上所能开发的应用程序类型,因此,即使理论上可以开发各式各样的应用程序,碍于手机先天的特性,导致Java游戏几乎就是Java手机应用程序的代名词。

大部分的人不喜欢拿手机办公事,但是肯定不会拒绝在无聊的时候,拿起手机玩玩轻松的小游戏,这也是商机的所在。明白了这个发展趋势,身为一个开发人员,要让自己的技术能力更进一步,充实游戏设计的知识肯定是重点。可是市面上讲述游戏设计的书籍,多半是以DirectX、OpenGL为主角,配合C/C++讲述。纵使有几本讲解Java游戏设计的书,也是以AWT/Java 2D/Java 3D为基础,这些API都是手机程序开发人员无法存取的功能。虽然说游戏设计的概念大同小异,但是上述书籍总是有隔了一层的感觉。

Martin J. Wells所撰写的《J2ME Game Programming》,正是一本可以满足Java手机开发人员需求,又没有上述书籍缺点的好书。这本书以MIDP内建的LCDUI为基础,说明如何应用标准LCDUI API之中的低阶模式来设计游戏,本书也提到如何擅用Game API,减轻游戏开发的负担。

本书最有特色的部分,在于说明『如何让您的Java手机程序赚大钱』,不像典型技术书籍只教导我们如何发挥某种技术的最大功能(当然,技术好与卖的好,本身还是有某种程度的关联)。因此这本书有特别的章节介绍移植(porting)相关议题,因为程序能够在越多手机上执行,目标市场才会越大,才会有越多人购买。本书亦有章节特别介绍本地化(Localization),我们所开发的程序如果能用越多国家的语言呈现,您的客户就不会仅局限于中文使用者,使用日文、俄文等其它国家的人,一样会让您赚进更多钞票。

身为一个技术人员,有时候很难了解,一个产品要卖的好,除了技术之外,营销和贩卖占了更大的比重,有了好的营销包装,可以把60分的烂产品讲成100分的好产品,有了好的销售管道,除了可以把东西卖给原本只有一点购买意愿的人,甚至可以卖给本来不需要的人。作者了解营销和贩卖的重要,所以书中有两个章节,分别讲解如何让我们的程序卖相更好,以及如何擅用通路(Sale Channel)让我们的程序卖的更多。

在诸多游戏类型中,可以让人随时开始享受乐趣,又可以充分娱乐的游戏类型,莫过于动作游戏,动作游戏中,最吸引人的,大概就是射击类游戏了,笔者想起学生时代,总会被射击游戏的华丽声光效果吸引,无论是家里的游戏卡带,或是贡献给外面游乐场的硬币,都以射击游戏最多。

要如何设计好的射击游戏,如何完成里头超炫的武器及特殊技,都可以在松浦健一郎所撰写的《射击游戏算法与程序原理(Shooting Game Algorithm Maniax)》书中,得到很好的答案。绝大多数的人都可以同意,日本人对于射击游戏的设计,已经到了炉火纯青的地步,这本书原文以日文撰写成,本来就是一本开发射击游戏的必备宝典,加上林世荣、黄政凯先生优质的翻译,让中文读者可以享受到和原文一样的质量。

本书虽然以C/C++为开法语言来实做算法,但是几乎没有用到C/C++的特性(例如:函式库、指标),这些程序代码大部分可以在不经修改的情况下,全数通过Java编译器的编译,这对Java语言的使用者是一个福利。

这本书还有个非常贴心的地方,就是作者明白,在目前大部分的Java手机执行环境或是使用较老旧处理器的装置,没办法使用浮点数,所以作者也针对这些无法使用浮点数运算的情形,提供整数的解法,这是目前手机游戏开发人员最需要的信息,也是本书最有价值的地方。

最后,我们讲到手机平台的不一致性。许多人会问,Java不是号称跨平台吗? 为什么还会有不一致的情形发生呢? 这是因为手机先天上的多样性,比方说屏幕的大小,按钮的配置,分辨率,色深等,处于百家争鸣的情形,这是一个很难改变的现实(如果所有的手机都跑Windows,外观都大同小异,这个世界肯定无趣许多)。因此,即使Java有再好的架构,也无法让程序完全的跨平台(可以执行,但是会怪怪的),这也是为什么《J2ME Game Programming》这本书需要花许多篇幅讨论移植问题的原因。

再者,每家手机厂商都会为自己的Java执行环境增添特殊的功能,一来绑住开发人员和使用者,一来可以让Java程序更能够发挥手机的特性(例如:照相机、蓝芽、多媒体等),贴近手机的特色。因此,如果只想开发一般的Java手机程序,上述的书籍就已经足够,但是要发挥各厂牌手机的特色,就必须多阅读官方释出的技术文件,Nokia的手机就到Forum Nokia寻找技术文件、SonyEricsson的手机就到SonyEricsson官方开发网站、Motorola的手机就到MotoCoder网站。

但是,藉由技术文件取得的信息毕竟是离散的,要学习完整的知识,还是需要一本专门介绍的书才可以。市面上唯一一本专注特定厂商的Java开发专书《Developing Scalable Series 40 Applications : A Guide for Java Developers》,以Nokia Series 40手机的特性为基础,说明如何开发Java应用程序。

Nokia Series 40是目前Nokia最低阶的手机,显示屏幕最小,操作方式受限较大,要利用这种手机来开发令人满意的应用程序,需要不同于一般的使用者接口设计与操作逻辑,这本书虽然只专注于Nokia手机,而且还仅仅只是专注于Nokia某一个系列的手机,但是里头所呈现的手机程序设计观,测试与除错方法,都是一个手机程序开发人员值得去深入探索的。

(2005-09-08 21:05:28.0) Permalink Comments [0]

TUESDAY SEPTEMBER 06, 2005

世界上最短又最长的距离 – 让我们更了解抽象层优点的好书

IT的世界,真的进步了吗?

『在过去的这10年之中,IT界大体上没有什么太大的变化。』

大多数朋友听到以上这句话,或许会深深不以为然。『谁说变化不大? 每天推出一些新技术、新名词,把我们技术人员搞的昏头转向,东西学也学不完! 已经心中已经萌生放弃一切改卖咸酥鸡的念头了!』。如果您一样无法同意笔者的论点,那么底下我想试着说服您。

万变不离其宗

把自己过去所学拿出来,静心地想一想,这些所谓的新技术、新名词,真的是让人耳目一新的东西吗? 有人说Web Services是新东西,其实只是过去的RPC (Remote Procedure Call)技术,如CORBA、COM、RMI等的变种,基本原理根本没改变,几乎仅是将原来二进制的数据传输方式改用XML罢了。有人说JDO、EJB、Hibernate是新技术,其实这些不过是基于O/R Mapping概念的实现与改进。有人说Struts、JSF(JavaServer Faces)是新技术,然而这些Framework的设计,却没有偏离过MVC Design Pattern的概念,也从来没有脱离过HTML的大门。还有最近几年最困惑各公司CIO以及CTO的问题:『该选用Java Solution或.NET Solution?』、信息相关科系学生最常问的问题:『该学Java或.NET?』,殊不知Java跟.NET本质上几乎是一样的东西,纵然应用上互有消长,却没有人会因为学了另外一个东西,导致难以融入另外一种技术,君不见国内某位Java界大师级人物,并非一开始就进入.NET领域,可是他对.NET技术的领悟却高于其它早已进入的技术人员。更有趣的是,原本设计给Java的开放原始码工具,也都跑出了.NET版,如Ant变成NAnt、JUnit变成NUint、Hibernate变成NHibernate。表面上水火不容的技术,私底下却不断地发生『和亲』事件,眼光锐利的开发人员,一眼就看破假象,不会被官方的营销语言唬的一愣一愣的。

那么,到底什么东西改变了?

那么,为什么会出现那么多的新名词困扰IT从业人员呢? 答案很简单 – 因为抽象层越来越多。这些年来,改变的并不是技术的本质,而是为了让开发工作更简单,更有效率、更容易维护,所以不断出现各式各样的抽象层。什么叫做抽象层呢? 简单的来说,只要您所撰写的程序代码,需要经过转换才能执行,那么这个转换的工具就称为抽象层。举例来说,现在网页上最火热的Flash,里面所使用的ActionScript,最后经过Flash的Runtime Engine解译才能执行,所以Flash Runtime Engine就是一种抽象层。有人嫌Flash还是太难,所以发展了Flex、或是开放原始码的Open Laszlo,开发人员撰写的是XML,可是最后却转换成Flash呈现在网页上,所以Flex和Open Laszlo就是一种抽象层。

抽象层的实例俯拾即是。

汇编语言太难写,那就发明更高阶的C语言。C语言的指针太难搞,就搞个没有指标概念的Java。Java还是太难,再用Java写个Script语言,例如BeanShell。一层包一层,即使最后执行的指令还是与汇编语言指令相距不远的机器语言,但是开发人员至少与机器相隔了三重天。CGI太难写,所以发展了Servlet。Servlet还是太复杂,没关系,有JavaServer Pages。开发人员觉得JavaServer Pages还是太难,那设计一堆可以重复使用的Tag Library总行了吧。可是开发人员更希望像开发VB程序一样,拖拖拉拉就可以写出程序,只好再发展JavaServer Faces满足开发人员的胃口。谁知道接下来还会以这些为基础,发展出什么新玩意儿呢? 开发人员所开发的动态网页,哇~ 随便讲讲又和最基本的HTML隔了四重天、五重天。于是,开发人员和机器隔离的越来越远,真实地成为了世界上最短又最长的距离。而太多的层次,最大的缺点就是效能,不断地转译,耗费更多的内存,也让 2GHz的CPU,执行应用程序的速度,好像没有比过去DOS时代的486快多少。就好像一个国家,如果政府机构一层又一层,行政效率肯定不高,而且还会浪费公帑。

抽象层带来了什么好处?

虽然说抽象层会造成效率的下降,系统资源的耗损,可是却带来了一个很大的优点 – 弹性。弹性可以展现在很多面向上,对Java开发人员来说,展示弹性最基本的地方莫过于Java本身的Reflection机制,乍看之下,Reflection和C++所具备的RTTI(Runtime Type Information)类似,不过Reflection机制却可以带来更有威力的应用。一般而言,实作系统程序(Application Server、Container、IDE等)的工程师比较有机会用到Reflection,一般的开发人员很少有机会体验Reflection所带来的好处。甚至因为误用,以为做出了一个非常有『弹性』的系统,结果却是一个太过『松散』,难以维护的系统。知道Reflection能够怎么用,以及如何正确地使用,就是一个重要的课题。Manning出版社所出版的Java Reflection in Action正是一本这样的书籍。薄薄的273页。道尽所有和Reflection有关的议题,很多深入的知识让其它书籍难以望其项背。

本书一开始就介绍Method Object,以及Method Object所带来的动态呼叫(Dynamic Invocation)功能,让开发人员可以在程序执行时期,先查询类别所具备的Method,然后再决定叫用哪一个Method。充分让读者享受到Reflection的强大威力。接下来,作者为大家介绍Field Object,这是一个可以在执行时期得知对象所具有的字段之功能。此功能的重要性在于,Java的序列化永续储存功能(Serialization),或是我们在整合开发工具之中所看到的Property Sheets,都是原自Field Object所具有的功能。从这里开始,读者开始接触系统程序(System Programming)的实作。

作者在本书中,花了两个章节,解释类别加载器(Class Loader)以及动态加载的功能,可以让读者更了解Reflection功能的来龙去脉。在本书中,最重要的,莫过于讲述Java Dynamic Proxy的章节,这大概是众多Java相关书集中,将Dynamic Proxy解释的最清楚的一本书。正常的Java程序设计师,会接触到Dynamic Proxy的少之又少,可是,它却又在我们的生活中扮演重要的角色,举凡EJB技术与JAX-RPC技术中常常用到的Stub/Proxy,或是单元测试工具JUnit,都有Dynamic Proxy的存在,如果您想知道这些技术如何运作,那么这一章是绝对不能省略的。

在本书最后两个章节,作者利用一个章节说明Reflection所带来的缺点 – 效能降低,该如何去量测与面对,让开发人员不至于『言必称Reflection』,结果造成一个没有效率的系统。而最后一个章节,作者说明了J2SE 5.0之后,JSR 14 Generic以及JSR 201 Language Extension在Reflection所带来的对应改变,更谈到了各种具有Reflection特性的Java竞争者(最大的当然是C#),让大家了解其它语言在Reflection机制上与Java的差异性。作为一本介绍Java Reflection的书籍,本书可以说是『鞠躬尽瘁』。

更多的抽象层,最后世界会变得如何呢?

虽然抽象层带来了一个千变万化的世界。不过笔者开始对无穷无尽的抽象层感到厌烦。当这些抽象层越来越多,会不会有一天,引发下一波的革命,反璞归真呢?。这是一个有趣的议题,笔者也期待着下一波革命的到来。 (2005-09-06 05:18:21.0) Permalink Comments [1]

MONDAY SEPTEMBER 05, 2005

剖析操作系统运作的好书

国内有一家知名的老牌出版社,过去出版了很多经典的老书,包括Windows操作系统核心、CPU保护模式等,几乎每本都脍炙人口,可是近几年却没有类似的出版品问世。笔者对该出版社的转变感到非常疑惑,所以逮到机会就询问该出版社的朋友,他们给我的答案是,过去的IT从业人员,看到任何讲述特殊技术的书籍,或是看不懂的书名,不管如何,一定会买一本回家,找机会学习。而现在的IT从业人员,见到看不懂的书名就避之唯恐不及,买书都是以可以最快找到他们所要的结果为主,而这些朋友在学生时代,通常只购买能够最快找到课堂作业答案的书籍。

其实这种情况的演变,并非现代IT从业人员的错。在过去,开发人员可以直接在DOS下叫用中断,直接和机器沟通,在Windows下,最有效率的方法就是直接呼叫Win32 API。而随着时代的进步,软件越来越复杂,整个信息科技的分枝越来越细,再也没有任何一个人有能力搞懂所有的技术,就像现代西方医学的分类,内科医生对泌尿系统的了解比不上泌尿科医生,泌尿科医生对肾脏的了解,也比不上专攻肾脏的肾脏科医生。懂得操作系统运作的人不见得了解Java虚拟机器如何运作,而知道如何实做Java虚拟机器的人,也不见得可以写出好的Java应用程序。所有的开发人员和真正运作的机器之间,隔了一层又一层的抽象层。这些抽象层之所以产生,就是为了让开发人员『不要管底层怎么做』,可以快快乐乐地开发应用程序。于是,Java和.net变成显学,在这个以Web应用程序为主的时代里,ASP.net和JavaServer Faces变成显学中的显学,却鲜少人会问『那么CLR Hosting怎么实现?』、或是『如何实作一个J2EE Web Container?』因为这些问题没有急迫性,就算不懂,对薪水根本没影响,如果花时间去穷究,反而项目惠赶不上时程进度。

即使如此,操作系统还是每天出现在我们生活中,我们买来的硬件要能够帮我们做点事,非得先灌好操作系统才行,不管是Windows、Linux、FreeBSD、或是Solaris x86版。撇开汇编语言不谈,要在每种平台上开发出最有效率的应用程序、或是发挥该平台所赋予的所有功能、甚至想要产生一个抽象层让其它人快快乐乐地开发应用程序,那么C或C++无疑是最佳选择,这是一个与机器隔阂最少的位置。当您选择了这条路,虽然少了现代高阶程序语言所附的丰富函式库(Java Class Library、.NET Framework),很多功能都要自己亲自动手,但是也进入了一个前所未有的发挥空间。既然这是一个离机器最近的位置,开发人员跟机器之间只隔了一个操作系统,这个时候,了解操作系统的运作就变得非常重要。

市场占有率最高的操作系统

如果您所从事的平台是目前占有率最高的Windows平台,Microsoft Windows Internals, Fourth Edition: Microsoft Windows Server 2003, Windows XP, and Windows 2000这本书就是必备书籍。这本书经过四个版本的演进:

Windows NT for Open VMS Professionals

Inside Windows NT, Second Edition

Inside Microsoft Windows 2000, Third Edition

Microsoft Windows Internals, Fourth Edition

每一次改版,作者都将Windows操作系统最新的改变与信息做了详尽的说明。作者之一的 David A. Solomon,早期在Digital Equipment Corporation,将近10年的时间从事VAX/VMS的开发工作,后来全心转移至Windows NT开发人员的教育训练工作(曾经有人说,WNT就是从VMS三个英文字母各自向后偏移一个字母而来),业界一直认为Windows NT和VMS关系匪浅,因为Windows NT的开发人员很多来自Digital Equipment Corporation,尤其是VMS的首席设计师,也是Windows NT设计小组的成员。从这本书的版本演进,大体上可以看出一个轮廓。

来势汹汹的小企鹅

除了Windows操作系统之外,市场上公认最具有浅力的大概就是Linux操作系统,要能够理解Linux Kernel,首推Understanding the Linux Kernel, 2nd Edition这本书,不过这本书于2002年出版,讲解的是2.4版的Kernel,而目前最新的Kernel版本为2.6,因此稍嫌老旧了些,即使如此,并不影响这本书的可读性,作为一本介绍Linux Kernel的入门书,这本书有其独特性。阅读此书的时候,建议可以搭配O’Reilly的另外一本书Linux Device Drivers, 3rd Edition为辅助,这本书第三版于2005年2月出版,讲的是2.6版Kernel上的驱动程序开发,大家都知道驱动程序的开发和操作系统内部运作有密不可分的关系,因此这本Linux Device Drivers, 3rd Edition,有很多地方足以和Understanding the Linux Kernel, 2nd Edition相辅相成,弥补一些新旧版Kernel上的差异,或者作为彼此书中主题的辅助和延伸。

专家们喜爱的小恶魔

另外一个广为人使用的Unix操作系统,就是以一个小恶魔为图腾的FreeBSD了。FreeBSD以严谨着称,虽然并非各种新软件都能够立刻找到FreeBSD的版本,但是FreeBSD的稳定性,让很多专家们爱不释手,尤其是目前火热的MacOS X操作系统,其核心Darwin,有很大的部分也是来自于FreeBSD的Kernel。所以不管是想研究FreeBSD或是MacOS X操作系统的朋友,这本The Design and Implementation of the FreeBSD Operating System肯定可以带来最多帮助,专门介绍Linux Kernel的书有许多,但是介绍FreeBSD Kennel的书仅此一本。

开放的太阳

Solaris一直是业界公认最稳定的商用UNIX操作系统,可用的应用程序也高居商用UNIX之冠,从笔者大学时代学习IC设计时,SUN工作站就一直扮演重要的角色。SUN于2005年初推出了Solaris 10操作系统,除了更漂亮的操作画面,更增加了许多让开发人员可以更容易找出程序错误的机制(例如:DTrace)。应应开放原始码的潮流,SUN准备于2005年第二季开放Solaris原始码,读者可以参考 http://www.opensolaris.org/ 取得最新信息。在Solaris开放原始码后之后,相信会有更多人对Solaris的应用更有兴趣,到时候一定会出现专门介绍Solaris Kernel的书籍,不过到目前为止,唯一一本可以帮助大家更认识Solaris Kernel内部数据结构和运作方式的书籍,只有Solaris Internals: Core Kernel Architecture这本书,这本书于2000出版,介绍的内容大致上以Solaris 2.6/2.6及Solaris 7为基础,和最新的Solaris 10相隔了三个版本,可以说相距甚远。不过这本书所讲解的内容,有很多地方并没有随着Solaris版本的改变而改变,例如档案系统的部分,在新版的Solaris中,只有增加新的档案系统,但是其本质和运作方式一直没有改变。 (2005-09-05 04:05:37.0) Permalink Comments [0]

SUNDAY SEPTEMBER 04, 2005

如何用Java开发游戏 – 谈Java游戏设计的好书

什么? 拿Java来开发游戏!!

如果有一天,某个软件开发人员对游戏软件设计产生了兴趣,想找个业界的朋友询问游戏软件的开发经验,第一个问题一定是:『我该选择哪一种程序语言呢?』,通常得到的答案只有三个:

1. C

2. C++

3. C 或 C++

这是非常合理的答案。开发人员不想接触太低阶的汇编语言,可是又希望榨干硬件的每一分资源,C或C++是最能满足这个条件的语言。Java语言出现在1995年左右,当时的硬件条件,加上早期Java本身的成熟度的不足,导致『Java == 龟速』这个恒等式烙印在很多开发人员的心里。所以自然无法成为游戏开发的主流语言。

Java可以拿来开发游戏吗?

笔者常常开玩笑说:『Java是带业出世的!』,所谓的『业』指的就是『业障』,也就是Java需要JVM才能够执行,与生具来就很难在正常的情况下,拥有比C或C++还要出色的效能。这几年来,JIT Compiler技术的改良、HotSpot技术的精进,还有许多探讨如何撰写更有效率Java的书籍充斥于书店,加上硬件的进步,其实Java早就具备开发游戏的实力了,只是需要更多成功范例来说服开发人员。关于成功范例,可以在SUN官方网站 http://java.com/en/games/ 看到各种以Java开发游戏的精采范例。如果您是游戏开发人员,那么SUN官方针对开发人员所成立的技术论坛http://community.java.net/games/,也是一个必去的好地方。

如果读者仍然对Java是否能够制作游戏心存疑惑,笔者必须说:『只要有心,人人都可以用Java制作出好游戏』。就如同大多数人认知的Script语言,也是一种速度很慢的语言,很少人拿来制作游戏,如果您看过使用JavaScript所设计的的星海争霸(http://elf.jsgame.net/sc/),多少可以体会,语言的原罪并非无法克服。

讲解Java开发游戏的好书

主流的C、C++行之有年,许多工具、函式库、关于游戏设计的书等,都是以C、C++为主,像是著名的Game Programming

Gems 系列(目前原文书出到第五集,中文翻译书名《游戏程序设计精华》,目前出到第二集)。Java游戏设计的书,在原文书方面虽然比不上C、C++来的多,但是也够令人耳花撩乱,质量差异甚大。反倒是中文翻译书,通常挑选质量较佳的原文书进行翻译,在台湾也大多由质量受到肯定的出版社进行翻译,这算是身处台湾的幸福。笔者挑出几本原文与翻译质量一样好的几本书,与读者分享。

英文原文翻译书:

从做中学:手机游戏程序设计 (Beginning Mobile Phone Game Programming) /上奇

大师谈 Java 游戏设计 (Developing Games in Java) /上奇

日文原文翻译书:

Java Game Programming 建立游戏的算法与框架 (Java Game Programming Algorithm and Framework) / 博硕

还有更全面性的好书吗?

目前市面上的游戏,不管是PC游戏,或是游乐器游戏,除了讲究2D、3D、声光效果、更强调善用网络,好比目前最风行的在线游戏(On-Line Game),就充分运用了网络,达到多人共乐的效果。然而,恐怕得买上5-6本书,才能够学到开发这些现代游戏所需要的技术。O’Reilly所出版的Killer Game Programming in Java就是这样一本书。本书接近1000页,共有四大主题: Java 2D、Java声音处理、Java 3D、Java网络程序设计,并在附录介绍如何利用install4j或Java Web Start,让使用者方便地安装所撰写好的游戏软件。除了人工智能(AI)之外,这本书几乎涵盖了所有游戏开发所需要的知识,而这本书的不足,可以用O’Reilly的另外一本好书AI for Game Developers (O’Reilly台湾分公司有翻译计划,中文版名称为《游戏人工智能》) 弥补之。

Killer Game Programming in Java的作者,在第一章就列出了所有开发人员对于Java是否可以开发游戏软件的疑惑,包括『使用者较难安装Java程序』、『Java速度太慢』、『Java太高阶了,很难发挥硬件效能』、『有人真的拿Java开发应用程序吗?』等议题,一一释疑,并列出了许多相反的观点,以及可以实证的网络资源。接着,作者就从游戏的基本程序结构开始,介绍Java影像处理、2D图形处理、声音处理。到此,读者对游戏开发会有个基本的认识,也可以写出一个简单、并具有声光效果的Java游戏。接着作者采用标准的Java 3D API,讲解3D图形处理,这一个部分,是所有关于Java 3D的相关书籍之中,讲述的最精采的一个部分,笔者认为这也是本书最有价值的部分。最后,作者介绍Java网络程序设计,并延伸前面章节所介绍的3D游戏,改良成网络3D游戏。作为一本介绍Java游戏设计的书籍,笔者相信这是目前市面上就有参考价值的一本书。

(2005-09-04 23:48:39.0) Permalink Comments [1]

书评 - Mastering Regular Expression / O’Reilly

笔者认为,Regular Expression是非常值得学习的东西,

从简单的UNIX指令,程序语言,到XML Schema,SQL都有.

如果花点时间研究Regular Expression,会发现这是

投资报酬率很高的一种玩意儿

充斥于计算器领域的Regular Expressions

笔者第一次接触到Regular Expressions(中文翻译为『正规表示式』,接下来的内容接采用中文翻译名称),是在大学时期选修编译程序(Compiler)的时候。后来开始学习Unix操作系统管理,常常用到的Unix指令,也都支持正规表示式。因为工作的关系,常常需要处理文字文件,所以开始学习Perl,这时发现正规表示式真是个好东西,当大量机械化的文字处理工作迎面而来,正规表示式大幅减少了工程师的负担。现在最重要的两个平台 - .net与Java,也不约而同地提供可以支持正规表示式的API(Java在JDK 1.4之后才开始支持)。对于一个IT从业人员,正规表示式异常地重要,连Oracle 10g数据库都开始可以在SQL/PLSQL语法中支持正规表示式,可见正规表示式是一个多么有趣,具有多用途的工具,堪称『IT从业人员必备武器』之一。

什么是正规表示式?

正规表示式并非一个程序语言,而是一种专门用于比对以及置换文字的机制,几乎各种程序语言,或是涉及文字处理的软件工具都支持正规表示式。举例来说, 我们在想要搜寻或取代某个档案(或字符串)当中的满足某些条件的部分,我们就可以利用正规表示式,指示计算器以较严格或较宽松的条件去处理。一般Windows使用者所使用的编辑器的『搜寻』、『取代』功能只能单纯地找出某个数字文字序列的存在(例如:搜寻”port”,可能找出”important”);或者我们想一次找出Sun、SUN、sun三种大小写状态不同的文字,并忽略掉其它大小写状态的文字(sUN、suN…等),这些都是传统的搜寻取代很难做到的,但是只要利用正规表示式的机制,这些复杂的搜寻条件都可以迎刃而解。

学习正规表示式的好书

正规表示式发展了很长的时间,却由于缺乏一个统一标准,造成各种环境下的正规表示式语法都不尽相同,无法达到『只写一次,到处通用』的境界。虽然正规表示式的学习曲线不长,但是即使有了正规表示式的基本观念,却往往因不同环境之间的语法差异,让工程师伤透脑筋。要一次学好正规表示式,O’Reilly的出版的Mastering Regular Expressions绝对是上上之选,要应付未来各式各样不同语法的挑战,同一个作者所撰写的Regular Expression Pocket Reference(O’Reilly中文翻译本 - 正规式速查手册)更是不可或缺的工具书。

作者在书中第一章,就展示了正规表示式解决『实际问题』的能力,并建议我们把正规表示式当作是一种简单的语言来学习。所以把正规表示式的结构和语法做了详细的解释,读者可以发现,只要需要对文字做搜寻或取代,正规表示式就可以派上用场,而且几乎无所不能。从第二章开始,作者让正规表示式结合Perl,做点实际的应用,像是处理Email的内文(过滤、搜寻)、或是程序设计师常常需要对使用者所输入的参数做处理,这些过去我们直觉需要写程序来完成的工作,其实很多都可以用正规表示式漂亮地帮我们解决掉。第三章到第五章,作者带我们深入正规表示式的运作规则,并介绍许多实用的技巧。第六章之后,开始介绍正规表示式在各种程序语言上的运用,由于可以运用正规表示式的范围实在太大,作者仅仅挑选了Perl、Java、以及.net进行深度解说,其实已经可以满足目前大多数工程师的需求。

一辈子都可以受用的东西

在IT领域,很多人常常抱怨东西学了就变旧,又有很多新东西要学。但是仍然有些东西是不会随时时间演进,而有太多的改变,这些东西就具有学习的价值。正规表示式就是这样的东西,它绝对是每位IT从业人员必备的技巧之一。 (2005-09-04 07:52:27.0) Permalink Comments [0]

这里是技术专区

赶羚羊的世界总部是专门发表软性文章的,

而这里是发表技术文章的. Orz

(2005-09-04 03:34:44.0) Permalink Comments [0]

编辑推荐《精通正则表达式》(第3版) 目标读者

Intended Audience

任何有机会使用正则表达式的人,都会对本书感兴趣。如果您还不了解正则表达式能提供的强大功能,这本书展示的全新世界将会让您受益匪浅。即使您认为自己已经是掌握正则表达式的高手了,这本书也能够深化您的认识。第1 版面世后,我时常会收到读者的电子邮件反映说“读这本书之前,我以为自己了解正则表达式,但现在我才真正了解”。

以与文本打交道为工作(如Web开发)的程序员将会发现,这本书绝对称得上是座金矿,因为其中蕴藏了各种细节、暗示、讲解,以及能够立刻投入到实用中的知识。在其他任何地方都难以找到这样丰富的细节。

正则表达式是一种思想——各种工具以各种方式(数目远远超过本书的列举)来实现它。如果读者理解了正则表达式的基本思想,掌握某种特殊的实现就是易如反掌的事情。本书关注的就是这种思想,所以其中的许多知识并不受例子中所用的工具软件和语言的束缚。

如何阅读

How to Read This Book

这本书既是教程,又是参考手册,还可以当故事看,这取决于读者的阅读方式。熟悉正则表达式的读者可能会觉得,这本书马上就能当作一本详细的参考手册,读者可以直接跳到自己需要的章节。不过,我并不鼓励这样做。

要想充分利用这本书,可以把前6 章作为故事来读。我发现,某些思维习惯和思维方式的确有助于完整的理解,不过最好还是从这几章的讲解中学习它们,而不是仅仅记住其中的几张列表。

故事是这样的,前6 章是后面4 章——包括Perl、Java、.NET和PHP——的基础。为了帮助读者理解每一部分,我交叉使用各章的知识,为了提供尽可能方便的索引,我投入了大量的精力(全书中有超过1 200处交叉引用,它们用符号加页码的形式标注)。

在读完整个故事以前,最好不要把本书作为参考手册。在开始阅读之前,读者可以参考其中的表格,例如第92页的图表,想象它代表了需要掌握的相关信息。但是,还有大量背景信息没有包含在图表中,而是隐藏在故事里。读者阅读完整个故事之后,会对这些问题有个清晰的概念,哪些能够记起来,哪些需要温习。随着互联网的迅速发展,几乎所有工具软件和程序语言都支持的正则表达式也变得越来越强大和易于使用。

专业书评亚马逊书评

Mastering Regular Expressions, Third Edition Rating:

2006-11-26 21:02:26 Frederick J Eccher Jr [Reply | View]

Mastering Regular Expressions, Third Edition

By Jeffrey E. F. Friedl

Third Edition August 2006

Pages: 542

Series: Adobe Developer Library

ISBN: 0-596-52812-4

Description

Written in the lucid, entertaining tone that makes a complex, dry topic become crystal-clear to programmers, and sprinkled with solutions to complex real-world problems, Mastering Regular Expressions, Third Edition offers a wealth of information that you can put to immediate use.

全书行文清晰而轻松,清晰透彻地向程序员讲解复杂而枯燥的话题,还包含了真实开发中复杂问题的解法。《精通正则表达式(第3版)》提供了大量极有价值的知识,可以直接拿来使用。

The description above is quite an understatement. Even the full description does not do this book justice. Mastering Regular Expressions, Third Edition is almost a classic and should be on your bookshelf, chained down. If your programming friends, coworkers, or enemies try to borrow this book, beware. It takes quite a while to get it back, even bent, spindled and mutilated so you might not want it back [yeah that was actually tried]. You might try a rule about using it at your desk, but that did not work for me either.

上文的评价其实很保守。对于这本书,用整篇书评都用来夸赞都不为过。《精通正则表达式(第3版)》就是一本经典之作,应该放在你的书架上,认真摆好。如果你的朋友、同事或是对手想要借阅,一定得小心。因为要回来得花很多工夫,甚至最后“经过许多年”回到你手中时,书已经卷角、开线或者残缺,你已经不想要了。最好是立个规矩,这本书就摆在书桌上,但这对我同样无效。

My experience agreed with almost everything written, except that I do not have the in depth use of RegEx the author clearly has. I wish I was on the same page with him in experience with RegEx. I started with RegEx in college in the early 90s and remember six projects that I had to do that could have been much easier with this book. My programming experience used RegEx on occasion but not with the power explained in this book. I appreciate the detailed and thorough comparisons of the languages. The only word I really missed in the INDEX and Table of Contents was: SECURITY. Using RegEx to make sure security issues are properly handled would really help many programmers and developers.

我的经验与书中的大多数内容一致,只是我对正则表达式的使用不如作者那样精深。我希望自己关于正则表达式的经验能和作者一样丰富。我最早接触正则表达式是20世纪90年代早期,在学校里,我记得要完成6个项目,如果当时有这本书,就好办多了。我在开发中偶尔会用到正则表达式,但没有用到书中讲解的那些强大功能。我对语言之间详尽而彻底的比较很感兴趣。我没能在索引和目录中看到的唯一内容是:安全。使用正则表达式确保安全事宜的妥善处理能对开发人员提供切实的帮助。

The topics start with a Preface, then moves to Introduction to Regular Expressions, then Extended Introductory Example, then Overview of Regular Expression Features and Flavors, then The Mechanics of Expression Processing, then the Practical Regex Techniques, then Crafting an Efficient Expression, then Perl, Java, .NET, PHP, and finally the Index. Remember to read the Preface, it is very interesting. The author makes some points about how to read the book [the first six chapters] and how to THINK.

这本书以序言开头,然后是正则表达式导论,接下来是入门示例扩展,再介绍正则表达式特性和流派,正则表达式处理的原理,之后讲解使用正则表达式技巧,打造高效的正则表达式,最后是Perl, Java, .NET, PHP和索引。请不要略过序言,它非常有意思。在序言中,作者概要介绍了本书(前6章)的阅读方法以及如何正则表达式思考。

The 10 chapters are written very thoroughly. I like that about this book. Explanations of history and trivia are all over the place but are written like a story and easy to read. The figures are good and useful in the explanation of the concepts. The code is usually more than a few lines. This is a more complicated book and requires more expressive code examples.

全部10章都写得很用心。我喜欢这一点。关于历史和其它小故事的讲解随处可见,以讲故事的方式写出来,便于阅读。所用的图表很适合讲解概念。代码通常不只几行,这本书的内容比较复杂,所以需要更多的代码才能说清楚。

The topics are useful and helpful in just about any language, including the more recent powerful languages like .NET and Java.

书中的内容对编程语言来说非常有用,包括近期出现的重量级语言,例如.NET和Java。

I thought the discriminations made about the different languages that use Regular Expressions went from general to specific in a hurry. Even so, the book is pretty long and needs to be digested in discrete chunks. No way to read this in one evening. There is no way to digest the concepts and comparisons very fast, at least for me. This is valuable knowledge worth your time to read and digest as thoroughly as possible.

我认为,在分别讲解不同的语言,实现从一般原理到特殊实现之间的过渡时有些急促。即便如此,这本书的篇幅还是很长,需要分成几个部分来吸收,而不能在一夜之间整个读完。也没有办法非常快地掌握其中的概念和比较,至少对我来说是如此。这些知识非常有价值,值得花时间细细阅读和思考。

The 540+ pages were easy to read and understand, partly told as a story. I read it in one week. There were a few typos and grammar errors, but not very many. The book is for someone who is a beginner or an expert and needs to know the specific times when one regular expression has even a slight benefit over another. More experienced people should look it over to make sure they are up to speed with this author.

超过540页的篇幅,其中一部分是在讲故事,阅读和理解起来并不困难。其中有些印刷和语法错误,但并不多。这本书适合于初学者,如果专家希望知道,为什么特定场合下某个表达式比另一个稍快一些,也应该阅读这本书。更有经验的人也应该留意这本书,确保他们没有比作者差太多。

I would give this book 5 out of 5 stars. Definitive!!!!!

毫无疑问,我给这本书最高的五星。

Frederick J Eccher Jr

MBA

M.S. Management of Information Systems

A.B. Psychology

B.A. Biology

President, Board of Directors, Saint Louis Visual Basic Users Group

rick@stlvbug.net

November 26, 2006

Good and enjoyed reading it Rating:

2006-11-15 19:13:43 Vikramaditya J [Reply | View]

读来惬意的好书

Regular Expressions is basically the same across most languages (some variations as how you use it and terminology differences too), whether it may be C#, Javascript, PHP, Ruby, Python, TCL, Perl, or JAVA. This is amazing and should be used as an hand book for students and beginning to intermediate developers. As the book is in third edition some basics of the programming languages are expected to be know by its readers. Overall its a good book and worth a reading.

无论是C#,Javascript,还是PHP,Ruby,Python,Tcl,Perl或Java,在大多数语言中,正则表达式都是相通的(可能在术语和用法上有些区别)。这本书精彩纷呈,应该成为初学者和中级开发人员的必备读物。阅读新推出的第3版,要求读者对书中使用的程序设计语言有基本了解。总的来说,这是本好书,值得一读。

Not a Reference! Everything you ever wanted to know about regex! Rating:

不仅仅是参考手册!而是正则表达式的百科全书!

2006-10-20 08:26:36 ismism [Reply | View]

As the author states, this is not a reference. It is everything you might ever want to know about regular expressions and then some. Well written, but a bit too epic for me, and if you aren't interested in perl - as I am not - there is a lot of information you just don't need (or want).

如作者所说,这本书并不是参考手册。它包含了你希望了解的,关于正则表达式的方方面面的知识。书写的很棒,但我觉得有点贪多求全,如果你对Perl不感兴趣——比如我就是,书中的许多内容是不必要的。

Read all reviews

________________________________________

Media reviews

"Classics are funny things, especially in the world of books. There are books that people say "should' be classics (I'll refrain from mentioning names to protect the pretentious) and then there are books that people are too busy actually using to get around to listing as classics. Mastering Regular Expressions, now in it's third edition, is in the second group. It's one of those books that you see on desks in computer departments the world over. This is a real "doers" book...Nail it to your desk unless you want to be constantly retrieving it from your co-workers. If I might be permitted a Spinal Tap reference, this one goes to eleven. If you ever use regular expressions, are thinking of using regular expressions or are in the same room as a regular expression, then you need this book. "

经典都是有来头的,尤其对书本来说,更是如此。有的书只是“应该”成为经典(为给那些自命不凡者留面子,名字就不提了);还有的书,因为随时都要用到,反而没时间列在经典书单上。已经出到第3版的《精通正则表达式》,就属于后者。在世界各地,你都能从开发部门的书桌上找到这本书。它属于真正的“实干家”…如果你不想三番五次找同事借,还是摆一本在自己的书架上吧。对我来说,推荐它就相当于推荐电影《摇滚万万岁》中的精彩一幕——These Go To 11。如果你用过正则表达式,或是希望用到,或是正在使用,那么,你需要这本书。

-- Simon P. Chappell, Slashdot.org

"In sum, let me just say that any developer who finds the need to manipulate text - whether it be scraping a web page, creating a report, importing data, or a hundred other applications, is going to need Regular Expressions. Jeffrey's book provides a complete and mature approach that is fresh, timely and detailed. I would recommend this book for any developer...Highly recommended!"

让我来说,就是一句话:任何人,只要处理文本——无论是抽取网页,生成报表,导入数据,或是其它任何应用——都需要用到正则表达式。Jeffery的这本书对此提供了完整而充分的讲解,引人入胜,紧跟时代,清晰明确。我向所有开发人员推荐这本书,强烈推荐!

-- Peter Bromberg, EggheadCafe.com

"This is an impressive book; it's easily the best book I've encountered on regular expressions."

这本书读来印象深刻,关于正则表达式的书里头,这是我见过的最容易读懂的一本。

-- George Woolley, Oakland Perl Mongers

Read all reviews

王森书评

千头万绪 : 学习多执行绪程序设计的好书

找对书,多执行绪不再避之唯恐不及

科学家对于人类大脑的运作方式,目前仍存在许多争议。但是许多经过科学实验的证据显示,人类的大脑是以平行的方式工作。即使如此,笔者不免想起,大学时期选修操作系统(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上开发多执行绪应用程序的人,一样具有非常高的参考价值。

在这个Java与.NET的时代

如本文前面所提,这是一个以Web应用程序为主的时代,而采用的开发平台,除了PHP以外,就属Java(Servlet/JSP)与.NET)ASP.NET)。就算要开发Unix平台上的应用程序,也开始有许多软件采用Java(AWT/SWING)开发,如果要开发Win32平台的应用程序,采用.NET(Windows Form)而舍弃MFC/ Delphi的开发者也不在少数。再这个时代,开发原生(native)应用程序变成了相对少数人才具有的技能。

不管是Java或.NET的Web应用程序开发人员,多半很少体会到多执行绪的好处,这是因为底层的Container已经充分利用多执行绪增加系统效能,而位于更上层的开发人员,虽然工作简单了,但是也无形间丧失了学习多执行绪的能力。相较之下,使用AWT/SWING或Windows Form的开发人员,非得好好学习多执行绪,才能做出有效率的使用者接口。

教导如何在.NET下使用多执行绪的书本来就不多,笔者推荐MANNING的《.NET Multithreading》,如果是采用Java开发,那么O'Reilly 的《Java Threads, 3/e》一样是不错的选择。《Java Threads, 3/e》已经由欧莱礼台湾分公司翻译成中文版《Java Threads 深度探讨》,虽然在翻译上,很多英文长句都没有经过断句,就直接翻成一串很长的中文句子,但是整体而言,质量仍然不错。

需要注意的是,《.NET Multithreading》非常适合新手入门,但《Java Threads, 3/e》并非如此,即使是第一章,采用的范例也稍嫌复杂,初学者可能看了老半天,仍会丈二金刚摸不着脑袋,笔者建议可以先读读Prentice Hall PTR的《Core Java 7/e, Volume2》里面关于Thread的章节,然后再回头看《Java Threads, 3/e》,如此才会效果显着。

由于J2SE 5.0之后,Java在Thread上不再只是简单的synchronized关键词配上wait() 、notify()、sleep()等函式,还引进了Concurrency Utility,读者在购买这两本畅销书时,别忘了购买最新讲解J2SE 5.0的版本,才能学习到Java在Thread上的最新变化。

Thread人人会用,巧妙各有不同

话说戏法人人会变,巧妙各有不同。独孤求败用木剑就能够与对手大战七天七夜,平常人拿了倚天剑屠龙刀,恐怕也只能任人宰割。虽然多执行绪程序在撰写上较为困难,但是本身并非一个非常大的议题。光知道每一种平台对多执行绪的支持并非难事,但是如何运用这些基本元素,充分利用多执行绪的优点,恐怕在上述的书籍中着墨不深。

多半的人会认为,J2SE 5.0以前的Java,虽然支持多执行绪,但却只是简单的支持,只有J2SE 5.0之后,Java对多执行绪的支持才算完整,也才能做到许多过去很难完成的工作。但是当您看了博硕文化出版的《Java Multithread Design Pattern-Java多执行绪与平行处理》之后,有这样观念的人就会发现既有观念大错特错。

这本原著以日文写成,专门探讨Java Thread的书籍,使用JDK 1.3为基础,即使没有J2SE 5.0所提供的花俏功能,一样变出许多戏法。尤其是第一章后面的练习题,就算许多自认懂得使用Java撰写多执行绪程序的人,或是为了认证考试熟读Java Thread的人,非常有可能在做完练习题之后,才发现自己原来根本不懂Java Thread。

笔者也是在读完这本书之后,才知道Thread的世界原来别有一番天地,不只是教科书上那些枯燥的算法。虽然最近电视上常看到一堆抗议日本的游行与相关新闻,不过,笔者相信『不以人废言』,才能学到更多知识,眼界也才能更开拓。 (2005-09-11 18:43:49.0) Permalink Comments [1]

THURSDAY SEPTEMBER 08, 2005

基本Java手机程序学会了,接下来看什么书? 三本强化J2ME设计功力的好书

从2000年SUN推出KJava至今,Java手机程序的发展,已经迈向第五个年头了。您一定会发现,现在市面上的手机,不管高阶或低阶,支持Java就像手机一定要支持收发简讯一样理所当然。Java随着手机普及率的增加,理所当然地成为最广泛的目的平台。可是,相较于其它技术,教导开发人员如何开发Java手机程序的书,并没有因为这个平台越来越广泛而变多。目前市面上讲述Java手机程序设计的书,十之八九讲述基本概念。『我已经有了基本的Java手机开发能力,接下来我要看哪些书,让我这方面的能力更进一步呢?』这是许多开发人员最常在公开论坛询问的问题。

要回答这个问题,可以从两个方面来思考,首先是手机应用程序发展趋势这个面向,另一个面向则是手机平台的不一致性。我们先就手机应用程序的发展趋势来看。

即使目前手机内建的处理器运算能力已经高于几年前的个人计算机,联机速度也比过去还要快,但是手机永远是手机,在目前的手机设计无法突破之前,手机永远只能有一个无法满足人类视觉需求的小屏幕,键盘上的按钮永远比需求少一个,更无法使用鼠标来操控。这一点大大地限制了手机上所能开发的应用程序类型,因此,即使理论上可以开发各式各样的应用程序,碍于手机先天的特性,导致Java游戏几乎就是Java手机应用程序的代名词。

大部分的人不喜欢拿手机办公事,但是肯定不会拒绝在无聊的时候,拿起手机玩玩轻松的小游戏,这也是商机的所在。明白了这个发展趋势,身为一个开发人员,要让自己的技术能力更进一步,充实游戏设计的知识肯定是重点。可是市面上讲述游戏设计的书籍,多半是以DirectX、OpenGL为主角,配合C/C++讲述。纵使有几本讲解Java游戏设计的书,也是以AWT/Java 2D/Java 3D为基础,这些API都是手机程序开发人员无法存取的功能。虽然说游戏设计的概念大同小异,但是上述书籍总是有隔了一层的感觉。

Martin J. Wells所撰写的《J2ME Game Programming》,正是一本可以满足Java手机开发人员需求,又没有上述书籍缺点的好书。这本书以MIDP内建的LCDUI为基础,说明如何应用标准LCDUI API之中的低阶模式来设计游戏,本书也提到如何擅用Game API,减轻游戏开发的负担。

本书最有特色的部分,在于说明『如何让您的Java手机程序赚大钱』,不像典型技术书籍只教导我们如何发挥某种技术的最大功能(当然,技术好与卖的好,本身还是有某种程度的关联)。因此这本书有特别的章节介绍移植(porting)相关议题,因为程序能够在越多手机上执行,目标市场才会越大,才会有越多人购买。本书亦有章节特别介绍本地化(Localization),我们所开发的程序如果能用越多国家的语言呈现,您的客户就不会仅局限于中文使用者,使用日文、俄文等其它国家的人,一样会让您赚进更多钞票。

身为一个技术人员,有时候很难了解,一个产品要卖的好,除了技术之外,营销和贩卖占了更大的比重,有了好的营销包装,可以把60分的烂产品讲成100分的好产品,有了好的销售管道,除了可以把东西卖给原本只有一点购买意愿的人,甚至可以卖给本来不需要的人。作者了解营销和贩卖的重要,所以书中有两个章节,分别讲解如何让我们的程序卖相更好,以及如何擅用通路(Sale Channel)让我们的程序卖的更多。

在诸多游戏类型中,可以让人随时开始享受乐趣,又可以充分娱乐的游戏类型,莫过于动作游戏,动作游戏中,最吸引人的,大概就是射击类游戏了,笔者想起学生时代,总会被射击游戏的华丽声光效果吸引,无论是家里的游戏卡带,或是贡献给外面游乐场的硬币,都以射击游戏最多。

要如何设计好的射击游戏,如何完成里头超炫的武器及特殊技,都可以在松浦健一郎所撰写的《射击游戏算法与程序原理(Shooting Game Algorithm Maniax)》书中,得到很好的答案。绝大多数的人都可以同意,日本人对于射击游戏的设计,已经到了炉火纯青的地步,这本书原文以日文撰写成,本来就是一本开发射击游戏的必备宝典,加上林世荣、黄政凯先生优质的翻译,让中文读者可以享受到和原文一样的质量。

本书虽然以C/C++为开法语言来实做算法,但是几乎没有用到C/C++的特性(例如:函式库、指标),这些程序代码大部分可以在不经修改的情况下,全数通过Java编译器的编译,这对Java语言的使用者是一个福利。

这本书还有个非常贴心的地方,就是作者明白,在目前大部分的Java手机执行环境或是使用较老旧处理器的装置,没办法使用浮点数,所以作者也针对这些无法使用浮点数运算的情形,提供整数的解法,这是目前手机游戏开发人员最需要的信息,也是本书最有价值的地方。

最后,我们讲到手机平台的不一致性。许多人会问,Java不是号称跨平台吗? 为什么还会有不一致的情形发生呢? 这是因为手机先天上的多样性,比方说屏幕的大小,按钮的配置,分辨率,色深等,处于百家争鸣的情形,这是一个很难改变的现实(如果所有的手机都跑Windows,外观都大同小异,这个世界肯定无趣许多)。因此,即使Java有再好的架构,也无法让程序完全的跨平台(可以执行,但是会怪怪的),这也是为什么《J2ME Game Programming》这本书需要花许多篇幅讨论移植问题的原因。

再者,每家手机厂商都会为自己的Java执行环境增添特殊的功能,一来绑住开发人员和使用者,一来可以让Java程序更能够发挥手机的特性(例如:照相机、蓝芽、多媒体等),贴近手机的特色。因此,如果只想开发一般的Java手机程序,上述的书籍就已经足够,但是要发挥各厂牌手机的特色,就必须多阅读官方释出的技术文件,Nokia的手机就到Forum Nokia寻找技术文件、SonyEricsson的手机就到SonyEricsson官方开发网站、Motorola的手机就到MotoCoder网站。

但是,藉由技术文件取得的信息毕竟是离散的,要学习完整的知识,还是需要一本专门介绍的书才可以。市面上唯一一本专注特定厂商的Java开发专书《Developing Scalable Series 40 Applications : A Guide for Java Developers》,以Nokia Series 40手机的特性为基础,说明如何开发Java应用程序。

Nokia Series 40是目前Nokia最低阶的手机,显示屏幕最小,操作方式受限较大,要利用这种手机来开发令人满意的应用程序,需要不同于一般的使用者接口设计与操作逻辑,这本书虽然只专注于Nokia手机,而且还仅仅只是专注于Nokia某一个系列的手机,但是里头所呈现的手机程序设计观,测试与除错方法,都是一个手机程序开发人员值得去深入探索的。

(2005-09-08 21:05:28.0) Permalink Comments [0]

TUESDAY SEPTEMBER 06, 2005

世界上最短又最长的距离 – 让我们更了解抽象层优点的好书

IT的世界,真的进步了吗?

『在过去的这10年之中,IT界大体上没有什么太大的变化。』

大多数朋友听到以上这句话,或许会深深不以为然。『谁说变化不大? 每天推出一些新技术、新名词,把我们技术人员搞的昏头转向,东西学也学不完! 已经心中已经萌生放弃一切改卖咸酥鸡的念头了!』。如果您一样无法同意笔者的论点,那么底下我想试着说服您。

万变不离其宗

把自己过去所学拿出来,静心地想一想,这些所谓的新技术、新名词,真的是让人耳目一新的东西吗? 有人说Web Services是新东西,其实只是过去的RPC (Remote Procedure Call)技术,如CORBA、COM、RMI等的变种,基本原理根本没改变,几乎仅是将原来二进制的数据传输方式改用XML罢了。有人说JDO、EJB、Hibernate是新技术,其实这些不过是基于O/R Mapping概念的实现与改进。有人说Struts、JSF(JavaServer Faces)是新技术,然而这些Framework的设计,却没有偏离过MVC Design Pattern的概念,也从来没有脱离过HTML的大门。还有最近几年最困惑各公司CIO以及CTO的问题:『该选用Java Solution或.NET Solution?』、信息相关科系学生最常问的问题:『该学Java或.NET?』,殊不知Java跟.NET本质上几乎是一样的东西,纵然应用上互有消长,却没有人会因为学了另外一个东西,导致难以融入另外一种技术,君不见国内某位Java界大师级人物,并非一开始就进入.NET领域,可是他对.NET技术的领悟却高于其它早已进入的技术人员。更有趣的是,原本设计给Java的开放原始码工具,也都跑出了.NET版,如Ant变成NAnt、JUnit变成NUint、Hibernate变成NHibernate。表面上水火不容的技术,私底下却不断地发生『和亲』事件,眼光锐利的开发人员,一眼就看破假象,不会被官方的营销语言唬的一愣一愣的。

那么,到底什么东西改变了?

那么,为什么会出现那么多的新名词困扰IT从业人员呢? 答案很简单 – 因为抽象层越来越多。这些年来,改变的并不是技术的本质,而是为了让开发工作更简单,更有效率、更容易维护,所以不断出现各式各样的抽象层。什么叫做抽象层呢? 简单的来说,只要您所撰写的程序代码,需要经过转换才能执行,那么这个转换的工具就称为抽象层。举例来说,现在网页上最火热的Flash,里面所使用的ActionScript,最后经过Flash的Runtime Engine解译才能执行,所以Flash Runtime Engine就是一种抽象层。有人嫌Flash还是太难,所以发展了Flex、或是开放原始码的Open Laszlo,开发人员撰写的是XML,可是最后却转换成Flash呈现在网页上,所以Flex和Open Laszlo就是一种抽象层。

抽象层的实例俯拾即是。

汇编语言太难写,那就发明更高阶的C语言。C语言的指针太难搞,就搞个没有指标概念的Java。Java还是太难,再用Java写个Script语言,例如BeanShell。一层包一层,即使最后执行的指令还是与汇编语言指令相距不远的机器语言,但是开发人员至少与机器相隔了三重天。CGI太难写,所以发展了Servlet。Servlet还是太复杂,没关系,有JavaServer Pages。开发人员觉得JavaServer Pages还是太难,那设计一堆可以重复使用的Tag Library总行了吧。可是开发人员更希望像开发VB程序一样,拖拖拉拉就可以写出程序,只好再发展JavaServer Faces满足开发人员的胃口。谁知道接下来还会以这些为基础,发展出什么新玩意儿呢? 开发人员所开发的动态网页,哇~ 随便讲讲又和最基本的HTML隔了四重天、五重天。于是,开发人员和机器隔离的越来越远,真实地成为了世界上最短又最长的距离。而太多的层次,最大的缺点就是效能,不断地转译,耗费更多的内存,也让 2GHz的CPU,执行应用程序的速度,好像没有比过去DOS时代的486快多少。就好像一个国家,如果政府机构一层又一层,行政效率肯定不高,而且还会浪费公帑。

抽象层带来了什么好处?

虽然说抽象层会造成效率的下降,系统资源的耗损,可是却带来了一个很大的优点 – 弹性。弹性可以展现在很多面向上,对Java开发人员来说,展示弹性最基本的地方莫过于Java本身的Reflection机制,乍看之下,Reflection和C++所具备的RTTI(Runtime Type Information)类似,不过Reflection机制却可以带来更有威力的应用。一般而言,实作系统程序(Application Server、Container、IDE等)的工程师比较有机会用到Reflection,一般的开发人员很少有机会体验Reflection所带来的好处。甚至因为误用,以为做出了一个非常有『弹性』的系统,结果却是一个太过『松散』,难以维护的系统。知道Reflection能够怎么用,以及如何正确地使用,就是一个重要的课题。Manning出版社所出版的Java Reflection in Action正是一本这样的书籍。薄薄的273页。道尽所有和Reflection有关的议题,很多深入的知识让其它书籍难以望其项背。

本书一开始就介绍Method Object,以及Method Object所带来的动态呼叫(Dynamic Invocation)功能,让开发人员可以在程序执行时期,先查询类别所具备的Method,然后再决定叫用哪一个Method。充分让读者享受到Reflection的强大威力。接下来,作者为大家介绍Field Object,这是一个可以在执行时期得知对象所具有的字段之功能。此功能的重要性在于,Java的序列化永续储存功能(Serialization),或是我们在整合开发工具之中所看到的Property Sheets,都是原自Field Object所具有的功能。从这里开始,读者开始接触系统程序(System Programming)的实作。

作者在本书中,花了两个章节,解释类别加载器(Class Loader)以及动态加载的功能,可以让读者更了解Reflection功能的来龙去脉。在本书中,最重要的,莫过于讲述Java Dynamic Proxy的章节,这大概是众多Java相关书集中,将Dynamic Proxy解释的最清楚的一本书。正常的Java程序设计师,会接触到Dynamic Proxy的少之又少,可是,它却又在我们的生活中扮演重要的角色,举凡EJB技术与JAX-RPC技术中常常用到的Stub/Proxy,或是单元测试工具JUnit,都有Dynamic Proxy的存在,如果您想知道这些技术如何运作,那么这一章是绝对不能省略的。

在本书最后两个章节,作者利用一个章节说明Reflection所带来的缺点 – 效能降低,该如何去量测与面对,让开发人员不至于『言必称Reflection』,结果造成一个没有效率的系统。而最后一个章节,作者说明了J2SE 5.0之后,JSR 14 Generic以及JSR 201 Language Extension在Reflection所带来的对应改变,更谈到了各种具有Reflection特性的Java竞争者(最大的当然是C#),让大家了解其它语言在Reflection机制上与Java的差异性。作为一本介绍Java Reflection的书籍,本书可以说是『鞠躬尽瘁』。

更多的抽象层,最后世界会变得如何呢?

虽然抽象层带来了一个千变万化的世界。不过笔者开始对无穷无尽的抽象层感到厌烦。当这些抽象层越来越多,会不会有一天,引发下一波的革命,反璞归真呢?。这是一个有趣的议题,笔者也期待着下一波革命的到来。 (2005-09-06 05:18:21.0) Permalink Comments [1]

MONDAY SEPTEMBER 05, 2005

剖析操作系统运作的好书

国内有一家知名的老牌出版社,过去出版了很多经典的老书,包括Windows操作系统核心、CPU保护模式等,几乎每本都脍炙人口,可是近几年却没有类似的出版品问世。笔者对该出版社的转变感到非常疑惑,所以逮到机会就询问该出版社的朋友,他们给我的答案是,过去的IT从业人员,看到任何讲述特殊技术的书籍,或是看不懂的书名,不管如何,一定会买一本回家,找机会学习。而现在的IT从业人员,见到看不懂的书名就避之唯恐不及,买书都是以可以最快找到他们所要的结果为主,而这些朋友在学生时代,通常只购买能够最快找到课堂作业答案的书籍。

其实这种情况的演变,并非现代IT从业人员的错。在过去,开发人员可以直接在DOS下叫用中断,直接和机器沟通,在Windows下,最有效率的方法就是直接呼叫Win32 API。而随着时代的进步,软件越来越复杂,整个信息科技的分枝越来越细,再也没有任何一个人有能力搞懂所有的技术,就像现代西方医学的分类,内科医生对泌尿系统的了解比不上泌尿科医生,泌尿科医生对肾脏的了解,也比不上专攻肾脏的肾脏科医生。懂得操作系统运作的人不见得了解Java虚拟机器如何运作,而知道如何实做Java虚拟机器的人,也不见得可以写出好的Java应用程序。所有的开发人员和真正运作的机器之间,隔了一层又一层的抽象层。这些抽象层之所以产生,就是为了让开发人员『不要管底层怎么做』,可以快快乐乐地开发应用程序。于是,Java和.net变成显学,在这个以Web应用程序为主的时代里,ASP.net和JavaServer Faces变成显学中的显学,却鲜少人会问『那么CLR Hosting怎么实现?』、或是『如何实作一个J2EE Web Container?』因为这些问题没有急迫性,就算不懂,对薪水根本没影响,如果花时间去穷究,反而项目惠赶不上时程进度。

即使如此,操作系统还是每天出现在我们生活中,我们买来的硬件要能够帮我们做点事,非得先灌好操作系统才行,不管是Windows、Linux、FreeBSD、或是Solaris x86版。撇开汇编语言不谈,要在每种平台上开发出最有效率的应用程序、或是发挥该平台所赋予的所有功能、甚至想要产生一个抽象层让其它人快快乐乐地开发应用程序,那么C或C++无疑是最佳选择,这是一个与机器隔阂最少的位置。当您选择了这条路,虽然少了现代高阶程序语言所附的丰富函式库(Java Class Library、.NET Framework),很多功能都要自己亲自动手,但是也进入了一个前所未有的发挥空间。既然这是一个离机器最近的位置,开发人员跟机器之间只隔了一个操作系统,这个时候,了解操作系统的运作就变得非常重要。

目录

导引

第1章:介绍正则表达式的基本概念。

第2章:考察利用正则表达式进行文本处理的过程。

第3章:提供对于特性和工具软件的概述以及简史。

细节

第4章:揭示了正则表达式的工作原理的细节。

第5章:利用第4章的知识,继续学习各种例子。

第6章:详细讨论效率问题。

特定工具的知识

第7章:详细讲解Perl的正则表达式。

第8章:讲解Sun提供的java.util.regex包。

第9章:讲解.NET的语言中立的正则表达式包。

第10章:讲解PHP中提供正则功能的preg套件

……[看更多目录]

序言译者序

《精通正则表达式 第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部分之所以得名,原因在于……”),这样的处理,相信不会影响读者的理解。

在本书翻译结束之际,我首先要感谢霍炬,他的引荐让我获得了翻译这本书的机会;还要感谢博文视点的周筠老师,她谨慎严格的工作态度,时刻提醒我不能马虎对待这本经典之作;还有本书的责编晓菲,她为本书的编辑和校对做了大量细致而深入的工作。

另外我还要感谢东北师范大学文学院的王确老师,在我求学期间,王老师给予我诸多指点,离校时间愈长,愈是怀念和庆幸那段经历,可以说,没有与他的相识,便没有我的今天。

最后我还要感谢我的女友侯芳,她的陪伴,让我能够保持好的心情,全身心地投入到翻译中去。

本书是讲授正则表达式的经典之作,翻译过程中,我虽力求把握原文,语言通畅,但翻译中的错误,或许是在所难免的,对此本人愿负全部责任。希望广大读者发现错误能及时与我们联系,以便再版时修正,或是以勘误的形式公布出来,以惠及其他读者。

如今正则表达式已经成为几乎所有主流编程语言中的必备元素: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月于北京

前言

前言

Preface

本书关注的是一种强大的工具——“正则表达式”。它将教会读者如何使用正则表达式解决各种问题,以及如何充分使用支持正则表达式的工具和语言。许多关于正则表达式的文档都没有介绍这种工具的能力,而本书的目的正是让读者“精通”正则表达式。

许多种工具都支持正则表达式(文本编辑器、文字处理软件、系统工具、数据库引擎,等等),不过,要想充分挖掘正则表达式的能力,还是应当将它作为编辑语言的一部分。例如Java、JScript、Visual Basic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事实上,在一些用上述语言编写的程序中,正则表达式扮演了极其重要的角色。

正则表达式能够得到众多语言和工具的支持是有原因的:它们极其有用。从较低的层面上来说,正则表达式描述的是一串文本(a chunk of text)的特征。读者可以用它来验证用户输入的数据,或者也可以用它来检索大量的文本。从较高的层面上来说,正则表达式容许用户掌控他们自己的数据——控制这些数据,让他们为自己服务。掌握正则表达式,就是掌握自己的数据。

本书的价值

The Need for This Book

本书的第1 版写于1996年,以满足当时存在的需求。那时还没有关于正则表达式的详尽文档,所以它的大部分能力还没有被发掘出来。正则表达式文档倒是存在,但它们都立足于“低层次视角”。我认为,那种情况就好像是教一些人英文字母,然后就指望他们会说话。

第2 版与第1 版间隔了五年半的时间,这期间,互联网迅速流行起来,正则表达式的形式也有了极大的扩张,这或许并不是巧合。几乎所有工具软件和程序语言支持的正则表达式也变得更加强大和易于使用。Perl、Python、Tcl、Java和Visual Basic都提供了新的正则支持。新出现的支持内建正则表达式的语言,例如PHP、Ruby、C#,也已经发展壮大,流行开来。在这段时间里,本书的核心——如何真正理解正则表达式,以及如何使用正则表达式——仍然保持着它的重要性和参考价值。

不过,第1版已经逐渐脱离了时代,必须加以修订,才能适应新的语言和特性,也才能对应正则表达式在互联网世界中越来越重要的地位。第2 版出版于2002年,这一年的里程碑是java.util.regex、Microsoft .NET Framework和Perl 5.8的诞生。第2 版全面覆盖了这些内容。关于第2 版,我唯一的遗憾就是,它没有提及PHP。自第2 版诞生以来的4 年里,PHP的重要性一直在增加,所以,弥补这一缺憾是非常迫切的。

第3 版在前面的章节中增加了PHP的相关内容,并专门为理解和应用PHP的正则表达式增加了一章全新的内容。另外,该版对Java的章节也进行了修订,做了可观的扩充,反映了Java1.5和Java1.6的新特性。

文摘导引部分会把完全的门外汉变成“对问题有感觉”的新手。对正则表达式有一定经验的读者完全可以快速翻阅这些章节,不过,即使是对于相当有经验的读者来说,我仍然要特别推荐第3章。

第1章,正则表达式入门,是为完全的门外汉准备的。我以应用相当广泛的程序egrep为例,介绍正则表达式,我也提供了我的视角:如何“理解”正则表达式,来为后面章节所包括的高级概念打下坚实的基础。即使是有经验的读者,浏览本章也会有所收获。

第2章,入门示例拓展,考查了支持正则表达式的程序设计语言的真实文本处理过程。附加的示例提供了后面章节详细讨论的基础,也展示了高级正则表达式调校背后的重要思考过程。为了让读者学会“正则表达式的套路”,这章出现了一个复杂问题,并讲解了两种全然不相关的工具如何分别通过正则表达式来解决它。

第3章,正则表达式的特性和流派概览,提供了当前经常使用的工具的多种正则表达式的概览。因为历史的混乱,当前常用的正则表达式的类型可能差异巨大。此章同时介绍了正则表达式以及使用正则表达式的工具的历史和演化历程。本章末尾也提供了“高级话题引导”。此引导是读者学习此后高级内容的路线图。

细节

The Details

了解了基础知识之后,读者需要弄明白“如何使用”及“这么做的原因”。就像“授人以渔”的典故一样,真正懂得正则表达式的读者,能够在任何时间、任何地点应用关于它的知识。

第4章,表达式的匹配原理,循序渐进地导入本书的核心。它从实践的角度出发,考察了正则引擎真实工作的重要的内在机制。懂得正则表达式如何处理工作细节,对读者掌握它们大有裨益。

第5章,正则表达式实用技巧,教育读者在高层次和实际的运用中应用知识。这一章会详细讲解常见(但复杂)的问题,目的在于拓展和深化读者对于正则表达式的认识。

第6章,打造高效正则表达式,考察真实生活中大多数程序设计语言提供的正则表达式的高效结果。本章运用第4章和第5章详细讲解的知识,来开发引擎的能力,并避免其中的缺陷。

特定工具的知识

Tool-Specific Information

学习完第4、5、6章的读者,不太需要知道特定的实现。不过,我还是用了4个整章来讲解4种流行的语言。

第7章,Perl,详细讲解了Perl的正则表达式,Perl大概是目前最流行的主要的正则表达式编程语言。在Perl中,与正则表达式相关的操作符只有四个,但它们组合出的选项和特殊情形带来了大量的程序选项——同时还有陷阱。对没有经验的

……[看更多书摘]

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
更多商品
日本语能力考试:1级进阶
餐饮企业规范化管理全书
酒店规范化管理全书
基于IEC61131-3标准的控制系统及应用
MATLAB电机仿真精华50例
精通Spring 2.x:企业应用开发详解
Struts2权威指南:基于WebWork核心的MVC开发
电子设计教程
连锁企业促销技巧
可不可以不要上学(弯弯涂鸦日记3)
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有