提到正規表示法,許多人很有點不屑一顧:這東西,不登大雅之堂,再說也不是總要用到,何必專門花時間學習?
沒錯,正規表示法並不“總要用到”,但到了需要的場合用不上,常常產生“一分錢難倒英雄漢”的尷尬。經常需要處理文字的程式設計師自然會知道正規表示法的價值,其他的程式設計師如果不會正規表示法,即使開發的領域與文字處理沒什麼關係,也難免“躺著中槍”的命運——前幾天我遇到一個問題,將一行長長的位址拆分成多行,負責這部分的程式設計師的日常工作只是製作PDF 而已,拆分地址是很“邊緣”的功能,但不會正規表示法就無法準確折行(一般需要在標點符號出現的地方折行,而不能只在空白字元處折行,但是不同語言中的標點符號各有不同),結果一籌莫展;相反,如果了解正規表示法,就可以很容易地處理各種語言中的標點字元。
以我的開發經驗來看,專門花點時間熟練正規表示法,確實是非常有必要的。目前可以見到的關於正規表示法的書籍和資料有不少,但又各有不足。
在網際網路上,流傳著一些程式語言的正則文件和《30 分鐘教會你正規表示法》之類的發文。這種資料的好處是簡單直接,查到了,如果有現成的實例,而且適用於自己的語言,則可以直接拿來用;然而,其壞處也是簡單直接,因為缺乏背後原理的說明,如果找不到現成的實例,或找不到能在自己所使用語言中行得通的實例(需知道,同樣的正規表示法並不能直接套用到不同的語言中),則束手無策。
在正式的出版領域,已經有《精通正規表示法》、《正規表示法一定要會》之類的書籍出版,尤其是前者,堪稱關於正規表示法的經典著作,如果想認真學習正規表示法,這種書籍是必須閱讀的。但這種書籍也有一個弱點,即都是由英文版本翻譯而來的,更多地偏重英文文字的處理,身為中文世界的開發人員,我們經常需要處理中文文字——對於處理英文之外的字元,正規表示法已經提供了足夠豐富的功能,但如何用對、用好這些功能,資料卻很匱乏。
我經常需要給人說明正規表示法的相關知識,時常惋惜的是,開發人員為這些問題所困擾;正因為如此,本書的寫作動機便是著力彌補現有資料的缺陷。
相對於正則文件和速成教學發文,本書深入說明了比對背後的原理,常常會舉一反三,告訴讀者,這裡為何這樣寫,如果改成其他形式,會造成什麼結構;並且,集中說明和比較了多種語言中正規表示法用法的異同,方便讀者把現成的正規表示法“移植”到自己的工作環境中。
相對於《精通正規表示法》等正式的書籍,本書辟出專門的內容說明語言和編碼,告訴讀者如何設定編碼,如何正確處理中文等字元。另外,本書還涵蓋了.NET、Java、JavaScript、PHP、Python、Ruby 六種常用語言,對每種語言列出專門章節,不但詳細介紹了語言中正規表示法的用法,更點明了版本之間的細微差異,不但可以作為專門學習的教材,還可以成為有用的參考手冊。