- 正則指引(第2版)
- 余晟
- 3294字
- 2019-07-25 11:42:59
前言
提到正則表達式,許多人很有點不屑一顧:這東西,不登大雅之堂,再說也不是總要用到,何必專門花時間學習?
沒錯,正則表達式并不“總要用到”,但如果到了需要的場合不會用,往往面臨“一分錢難倒英雄漢”的困境。經常需要處理文本的程序員自然知道正則表達式的價值,其他的程序員如果不會正則表達式,即便開發的領域與文本處理沒什么關系,也難以躲過“躺著中槍”的命運—前幾天我遇到一個問題,將一行長長的地址拆分成多行,負責這部分的程序員的日常工作只是制作PDF而已,拆分地址是很“邊緣”的功能,但不會正則表達式就無法準確折行(一般需要在標點符號出現的地方折行,而不能只在空白字符處折行,但是不同語言中的標點符號各有不同),結果一籌莫展;相反,如果了解正則表達式,就可以很容易地處理各種語言中的標點字符。
按照我的開發經驗,專門花點時間學習一下正則表達式,確實很有必要。目前可以見到的關于正則表達式的書籍和資料有不少,但又各有不足。
在互聯網上,流傳著一些編程語言的正則文檔和《30分鐘教會你正則表達式》之類的帖子。這類資料的好處是簡單直接,如果有現成的例子,而且適用于自己的語言,則可以直接抄來用。然而,其壞處也是簡單直接,因為缺乏背后原理的講解,如果找不到現成的例子,或者找不到能在自己所使用語言中行得通的例子(要知道,一種語言下的正則表達式往往并不能直接套用到另一種語言中),則束手無策。
在正式的出版領域,已經有《精通正則表達式》、《正則表達式必知必會》之類的書籍出版,尤其是前者,堪稱關于正則表達式的經典著作,如果想認真學習正則表達式,這類書籍是必須閱讀的。但這類書籍的弱點也很明顯,即都是由英文版本翻譯而來的,更多側重英文文本的處理,身為中文世界的開發人員,我們經常需要處理中文文本—英文之外的字符。其實對于非英文字符的處理,正則表達式已經提供了足夠豐富的功能,可惜資料相當匱乏。
為解決這些問題,我花了很多時間研習各種資料,然后經常給人講解正則表達式的相關知識。我發現,很多人并不是不努力學,實在是合適的資料太少了。所以,我斗膽寫作這本書。
相對于正則文檔和速成教學帖子,本書深入講解了匹配背后的原理,而且往往會舉一反三,告訴讀者,這里為何這樣寫,如果改成其他形式,會造成什么結構差異;同時集中講解和比較了多種語言中正則表達式用法的異同,方便讀者把現成的正則表達式“移植”到自己的工作環境中。
相對于《精通正則表達式》等“正式”的書籍,本書辟出專門的章節講解語言和編碼,告訴讀者如何設定編碼,如何正確處理中文字符等。另外,本書還涵蓋了.NET、Java、JavaScript、PHP、Python、Ruby、Objective-C、Golang等常用語言,為每種語言專門撰寫相關內容,不但詳細介紹了語言中正則表達式的用法,更辨析了版本之間的細微差異,既可以作為專門學習的教材,也可以成為有用的參考手冊。
本書結構
本書分為三部分。
第一部分主要講解正則表達式的基礎知識,覆蓋常見正則表達式中的各種功能和結構。看完前3章,就可以基本弄明白現在流行的各種正則表達式;如果你之前有一些經驗,會覺得閱讀起來并不困難。但是我也希望讀者不要忽略其他的內容,斷言和匹配模式現在已經是正則表達式的“標準配置”了,而且確實可以派上大用場,所以第4章和第5章的內容,即便不是很熟悉,閱讀起來可能有一些麻煩,但也不應該忽略。最后的第6章,則厘清了正則表達式在使用中的若干疑惑,了解它們,你就可以相對自如地穿行于正則表達式的世界了。
第二部分主要講解關于正則表達式的深層次知識,這一部分用3章的內容,詳細探討了編碼問題、匹配原理、解題思路。這部分內容更抽象,需要多花一點時間來閱讀和理解,但是它們確實可以幫你在正則表達式的世界里登堂入室,脫離“術”的層面,掌握萬變不離其宗的“道”。
第三部分的作用是接地氣,將之前介紹的各種知識落實到常用語言.NET、Java、JavaScript、PHP、Python、Ruby、Objective-C、Golang中來。每一章的開頭有正則功能列表,其中的功能對應著前面部分的講解,這些功能的具體應用實例以及不同版本之間的差異,則在章節中詳細講解,每一章的最后還給出了常見任務的示例代碼,方便日后查詢。第18章簡要介紹了正則表達式在Linux下常用工具vi、grep、awk、sed中的使用,并通過一個實際的例子將這幾種工具串起來,對比說明了它們適合解決的問題。
在本書的最后提供了用作參考的3個附錄。
附錄A是正則表達式的常用功能在不同語言中的比對,希望能給需要在多種語言中使用正則表達式或者移植正則表達式的讀者提供一份有用的參考;附錄B給出了若干常見的正則表達式,比如匹配郵政編碼、身份證號、手機號、QQ號、電子郵件地址等,希望能成為常見問題的“速查手冊”;附錄C列出了常用正則表達式的工具和資源,方便大家調試自己的正則表達式,以及繼續深入學習。
本書的讀者對象
本書適合以下幾類讀者:
經常需要進行文本處理(比如日志分析或網絡運維)的技術人員。這些讀者或許已經熟悉了正則表達式的基本用法,但面對日益復雜化和海量的數據,閱讀本書可以幫助大家更準確、更高效地處理文本,提升自己工作的價值。
熟悉常用開發語言的程序員。雖然這些讀者不需要專職進行文本處理,但源代碼和許多數據其實也是文本,如果不會正則表達式,在偶然遇到處理源代碼或文本數據的任務時,往往會產生無力感。本書的第三部分可以幫你快速找到有關的例子,并落實在自己的編程語言中。當然前兩部分也非常有必要,因為它們可以幫你夯實基礎。
對正則表達式已經有一定了解的讀者。這些讀者雖然能用正則表達式解決常見的問題,但未必了解正則表達式的編碼問題、匹配原理、解題思路,仔細閱讀本書的第二部分,可以深入完善對正則表達式的理解;而第三部分詳細比較了可以使用正則表達式的各種語言,以及同一種語言中各種版本的差異。所有這一切,應該可以讓你對正則表達式的掌握更上一層樓。
致謝
一本書的完成,離不開眾多人的幫忙。
首先要感謝的是李笑來老師、周筠老師以及徐定翔和盧鶇翔兩位編輯。在我翻譯完《精通正則表達式》之后,李笑來老師三番五次地鼓勵我寫一本關于正則表達式的書,并且打消了我的很多顧慮;周筠老師、徐定翔和盧鶇翔兩位編輯在我寫作的最初階段做了大量細致耐心的工作。可以說,沒有他們,我就不會有寫作這本書的念頭,也不會有堅持完成的動力。
然后要感謝的是電子工業出版社的楊福平副總編、張月萍編輯、張春雨編輯和劉舫編輯,沒有他們的關照和辛勤工作,這本書的出版定然會遇到更多的困難。
感謝我的朋友霍炬和韓磊,雖然我之前閱讀過《精通正則表達式》,但與翻譯和寫作結緣,他們給了我莫大的幫助,于是今天才有了《正則指引》這本書。尤其值得一提的是,霍炬的夫人西喬,精心手繪了這本書的封面,我在這里要對她表示誠摯的謝意。
感謝我曾工作過的盛大創新院以及創新院的各位同事(李駿、郝培強、莊表偉、丁宇、許式偉、莫華楓、李道兵、趙劼、樊一鵬、張一寧等),創新院給了大家寬松自由的工作環境,與各位同事的討論加深了我對正則表達式的理解,也為我提供了許多例子。
感謝張東亮、陸亦斌、孫勇、葉勁峰等各位朋友,愿意撥冗閱讀本書的草稿,并提出了大量專業的意見。
感謝何源、陳鋼、賀鈞、陳馳等讀者,試讀本書之后提出了大量的寶貴意見,在最后關頭打消了我心中的許多忐忑。
在更早之前,我的父母從小就鼓勵我研究和了解各種科學原理(“玩也要動腦筋”),我之所以有興趣探究正則表達式背后的世界,而不滿足于“夠用/湊合”,都是受益于這種思維行為習慣。在中小學階段,我的語文老師羅碧玉、易璽銘培養了我對于文字的興趣,在大學階段,東北師范大學文學院的王確老師給了我這個理科生非常多的幫助和指引。對各位師長,在此一并表示感謝,能遇到你們是我的幸運。
最后還需要感謝許多為這本書做出過貢獻的人,你們的名字我可能暫時無法記起,或者無法一一羅列,但我會在心中保持對你們的感謝。
讀者服務
輕松注冊成為博文視點社區用戶(www.broadview.com.cn),掃碼直達本書頁面。
? 提交勘誤:您對書中內容的修改意見可在提交勘誤處提交,若被采納,將獲贈博文視點社區積分(在您購買電子書時,積分可用來抵扣相應金額)。
? 交流互動:在頁面下方讀者評論處留下您的疑問或觀點,與我們和其他讀者一同學習交流。
頁面入口:http://www.broadview.com.cn/35130
