讀古今文學網 > 精通正則表達式(第3版) > 前言 >

前言

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中,與正則表達式相關的操作符只有四個,但它們組合出的選項和特殊情形帶來了大量的程序選項——同時還有陷阱。對沒有經驗的開發人員來說,這種極其豐富的選項能夠讓他們迅速從概念轉向程序,當然也可能是雷場。本章的詳細介紹有助於給讀者指出一條光明大道。

●第8章 Java,詳細介紹了java.util.regex包,從Java 1.4以後,它已經成為了Java語言的標準部分。本章主要關注的是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\'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

●本書包含了大量的細節和例子,所以我設置了超過1 200 處的交叉引用,幫助讀者理解。它們通常表示為「☞123」,意思是「請參閱第 123 頁」。舉個例子:「…的說明在表8-2中(☞367)」。

練習

Exercises

有時候我會問個問題,幫助讀者理解正在講解的概念,尤其是在前幾章這種問題更多。它們並不是擺設,我希望讀者在繼續閱讀之前認真想想。請記住我的話,不要忽略它們的重要意義,本書中這樣的問題並不多。它們可以當作自我測試題:如果不是幾句話就能說明白的問題,最好是在複習相關章節之後再繼續閱讀。

為了避免讀者直接看到問題的答案,我使用了一點技巧:問題的答案都必須翻頁才能看到。通常你必須翻過一頁才能看到標著ϖ的答案。這樣答案在你思考問題的時候沒法直接看到,但又很容易獲得。

鏈接、代碼、勘誤及聯繫方式

Links,Code,Errata,and Contacts

寫第1 版時,我發現修改書本上的URL,保持與實際一致是件很費工夫的事情,所以,我沒有在書後羅列一個URL附錄,而是提供統一的地址:

http://regex.info

在這裡你可以找到與正則表達式相關的鏈接,書中的所有代碼,可檢索的索引以及其他資源。本書也可能存在錯誤☺,所以我提供了勘誤。

如果你找到書中的錯誤,或者僅僅是希望給我寫幾句話,請寫郵件到:[email protected]

我們已盡力核驗本書所提供的信息,儘管如此,仍不能保證本書完全沒有瑕疵,而網絡世界的變化之快,也使得本書永不過時的保證成為不可能。如果讀者發現本書內容上的錯誤,不管是贅字、錯字、語意不清,甚至是技術錯誤,我們都竭誠虛心接受讀者指教。如果您有任何問題,請按照以下的聯繫方式與我們聯繫。

奧萊理軟件(北京)有限公司

北京市 海澱區 知春路49號 希格瑪公寓B座809室

郵政編碼:100080

網頁:http://www.oreilly.com.cn

E-mail:[email protected]

與本書有關的在線信息如下所示。

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

http://www.oreilly.com.cn/book.php?bn=978-7-121-04684-1(中文版)