前言
提到正則表達(dá)式,許多人很有點(diǎn)不屑一顧:這東西,不登大雅之堂,再說也不是總要用到,何必專門花時(shí)間學(xué)習(xí)?
沒錯(cuò),正則表達(dá)式并不“總要用到”,但到了需要的場合用不上,往往產(chǎn)生“一分錢難倒英雄漢”的尷尬。經(jīng)常需要處理文本的程序員自然會(huì)知道正則表達(dá)式的價(jià)值,其他的程序員如果不會(huì)正則表達(dá)式,即便開發(fā)的領(lǐng)域與文本處理沒什么關(guān)系,也難免“躺著中槍”的命運(yùn)——前幾天我遇到一個(gè)問題,將一行長長的地址拆分成多行,負(fù)責(zé)這部分的程序員的日常工作只是制作PDF而已,拆分地址是很“邊緣”的功能,但不會(huì)正則表達(dá)式就無法準(zhǔn)確折行(一般需要在標(biāo)點(diǎn)符號出現(xiàn)的地方折行,而不能只在空白字符處折行,但是不同語言中的標(biāo)點(diǎn)符號各有不同),結(jié)果一籌莫展;相反,如果了解正則表達(dá)式,就可以很容易地處理各種語言中的標(biāo)點(diǎn)字符。
以我的開發(fā)經(jīng)驗(yàn)來看,專門花點(diǎn)時(shí)間掌握正則表達(dá)式,確實(shí)是非常有必要的。目前可以見到的關(guān)于正則表達(dá)式的書籍和資料有不少,但又各有不足。
在互聯(lián)網(wǎng)上,流傳著一些編程語言的正則文檔和《30分鐘教會(huì)你正則表達(dá)式》之類的帖子。這類資料的好處是簡單直接,查到了,如果有現(xiàn)成的例子,而且適用于自己的語言,則可以直接拿來用;然而,其壞處也是簡單直接,因?yàn)槿狈Ρ澈笤淼闹v解,如果找不到現(xiàn)成的例子,或者找不到能在自己所使用語言中行得通的例子(需知道,同樣的正則表達(dá)式并不能直接套用到不同的語言中),則束手無策。
在正式的出版領(lǐng)域,已經(jīng)有《精通正則表達(dá)式》、《正則表達(dá)式必知必會(huì)》之類的書籍出版,尤其是前者,堪稱關(guān)于正則表達(dá)式的經(jīng)典著作,如果想認(rèn)真學(xué)習(xí)正則表達(dá)式,這類書籍是必須閱讀的。但這類書籍也有一個(gè)弱點(diǎn),即都是由英文版本翻譯而來的,更多地側(cè)重英文文本的處理,身為中文世界的開發(fā)人員,我們經(jīng)常需要處理中文文本——對于處理英文之外的字符,正則表達(dá)式已經(jīng)提供了足夠豐富的功能,但如何用對、用好這些功能,資料卻很匱乏。
我經(jīng)常需要給人講解正則表達(dá)式的相關(guān)知識,時(shí)常惋惜的是,開發(fā)人員為這些問題所困擾;正因?yàn)槿绱耍緯膶懽鲃?dòng)機(jī)便是著力彌補(bǔ)現(xiàn)有資料的缺陷。
相對于正則文檔和速成教學(xué)帖子,本書深入講解了匹配背后的原理,往往會(huì)舉一反三,告訴讀者,這里為何這樣寫,如果改成其他形式,會(huì)造成什么結(jié)構(gòu);并且,集中講解和比較了多種語言中正則表達(dá)式用法的異同,方便讀者把現(xiàn)成的正則表達(dá)式“移植”到自己的工作環(huán)境中。
相對于《精通正則表達(dá)式》等正式的書籍,本書辟出專門的內(nèi)容講解語言和編碼,告訴讀者如何設(shè)定編碼,如何正確處理中文等字符。另外,本書還涵蓋了.NET、Java、JavaScript、PHP、Python、Ruby六種常用語言,對每種語言給出專門章節(jié),不但詳細(xì)介紹了語言中正則表達(dá)式的用法,更點(diǎn)明了版本之間的細(xì)微差異,不但可以作為專門學(xué)習(xí)的教材,還可以成為有用的參考手冊。
本書結(jié)構(gòu)
本書可以分為三大部分。
第一部分主要講解正則表達(dá)式的基礎(chǔ)知識,覆蓋常見正則表達(dá)式中的各種功能和結(jié)構(gòu)。看完前面3章,就可以基本弄明白現(xiàn)在流行的各種正則表達(dá)式;尤其是如果你之前有一些經(jīng)驗(yàn),會(huì)覺得閱讀起來并不困難。但是我也希望讀者不要忽略其他的內(nèi)容,斷言和匹配模式現(xiàn)在已經(jīng)是正則表達(dá)式的“標(biāo)準(zhǔn)配備”了,而且確實(shí)可以派上大用場,所以第4章和第5章的內(nèi)容,即便不是很熟悉,閱讀起來可能有一些麻煩,也不應(yīng)該忽略。最后的第6章,則厘清了正則表達(dá)式在使用中的若干疑惑,了解它們,你就可以相對自由地在正則表達(dá)式的世界里行走了。
第二部分主要講解關(guān)于正則表達(dá)式的更深入的知識,這一部分用3章的內(nèi)容,詳細(xì)探討了編碼問題、匹配原理、解題思路。這部分內(nèi)容更抽象,需要多花一點(diǎn)時(shí)間來閱讀和理解,但是它們確實(shí)可以幫你在正則表達(dá)式的世界里登堂入室,脫離“術(shù)”的層面,掌握萬變不離其宗的“道”。
第三部分的作用是接地氣,將之前介紹的各種知識落實(shí)到六種常用語言.NET、Java、JavaScript、PHP、Python、Ruby中來。每一章的開頭有正則功能列表,其中的功能都對應(yīng)著前面部分的講解,這些功能的具體應(yīng)用實(shí)例,以及不同版本之間的差異,則在章節(jié)中詳細(xì)講解,每一章的最后還給出了常見任務(wù)的示例代碼,方便日后查詢。在最后,第16 章簡要介紹了正則表達(dá)式在Linux下常用工具vi、grep、awk、sed中的使用,并通過一個(gè)實(shí)際的例子將這幾種工具串起來,對比說明了它們適合解決的問題。
在本書的最后提供了用作參考的3個(gè)附錄。
附錄A是正則表達(dá)式的常用功能在不同語言中的比對,希望能給需要在多種語言中使用正則表達(dá)式或者移植正則表達(dá)式的讀者提供一份有用的參考;附錄B給出了若干常見的正則表達(dá)式,比如匹配郵政編碼、身份證號、手機(jī)號、QQ號、電子郵件地址等,希望能成為常見問題的“速查手冊”;附錄C列出了常用正則表達(dá)式的工具和資源,方便大家調(diào)試自己的正則表達(dá)式,以及繼續(xù)深入學(xué)習(xí)。
本書讀者
本書適合以下幾類讀者。
經(jīng)常需要進(jìn)行文本處理(比如日志分析或網(wǎng)絡(luò)運(yùn)維)的技術(shù)人員。這些讀者或許已經(jīng)熟悉了正則表達(dá)式的基本用法,但面對日益復(fù)雜化和海量化的數(shù)據(jù),閱讀本書可以幫助你更準(zhǔn)確、更高效地處理文本,提升自己工作的價(jià)值。
熟悉常用開發(fā)語言的程序員。雖然這些讀者不需要專職進(jìn)行文本處理,但源代碼和許多數(shù)據(jù)其實(shí)也是文本,如果不會(huì)正則表達(dá)式,在偶然遇到處理源代碼或文本數(shù)據(jù)的任務(wù)時(shí),往往會(huì)產(chǎn)生躺著中槍的無力感。本書第三部分可以幫你迅速找到有關(guān)的例子,并落實(shí)在自己的編程語言中。當(dāng)然前兩部分也非常有必要,因?yàn)樗鼈兛梢詭湍愫粚?shí)基礎(chǔ)。
對正則表達(dá)式已經(jīng)有一定了解的讀者。這些讀者雖然能用正則表達(dá)式解決常見的任務(wù),但未必了解正則表達(dá)式的編碼問題、匹配原理、解題思路,仔細(xì)閱讀本書的第二部分,可以深化完善對正則表達(dá)式的理解;而第三部分詳細(xì)比較了使用正則表達(dá)式時(shí)各種語言,以及同一種語言中各種版本的差異。所有這一切,應(yīng)該可以讓你對正則表達(dá)式的掌握更上一層樓。
致謝
一本書的完成,必然離不開眾多人的幫忙。
首先需要感謝的是周筠老師和徐定翔、盧鶇翔兩位編輯,他們在我寫作的最初階段做了大量細(xì)心、耐心的工作,完全可以說,沒有他們的這些工作,我就不會(huì)有寫作這本書的念頭,或者堅(jiān)持寫完的動(dòng)力。
然后要感謝的是電子工業(yè)出版社的楊福平副總編和張?jiān)缕季庉嫞瑳]有他們的關(guān)照和辛勞工作,這本書的出版定然會(huì)遇到更多的困難。
感謝我的朋友霍炬和韓磊,雖然我之前閱讀過《精通正則表達(dá)式》,但與翻譯和寫作結(jié)緣,他們給了我莫大的幫助,有了這個(gè)契機(jī),才有了現(xiàn)在的《正則指引》。尤其值得一提的是霍炬的夫人西喬,精心手繪了這本書的封面,在這里表示誠摯的謝意。
感謝我曾工作過的盛大創(chuàng)新院以及創(chuàng)新院的各位同事(李駿、郝培強(qiáng)、莊表偉、丁宇、許式偉、莫華楓、李道兵、趙劼、樊一鵬、張一寧等),創(chuàng)新院給了大家寬松自由的工作環(huán)境,與各位同事的討論加深了我對正則表達(dá)式的理解,也為我提供了許多例子。
感謝張東亮、陸亦斌、孫勇、葉勁峰等各位朋友,愿意撥冗閱讀本書的草稿,并提出了大量專業(yè)的意見。
感謝何源、陳鋼、賀鈞、陳馳等讀者,試讀本書之后提出了大量的寶貴意見,在最后關(guān)頭打消了我心中的許多忐忑。
在更早之前,我的父母從小就鼓勵(lì)我研究和了解各種科學(xué)原理(“玩也要?jiǎng)幽X筋”),我之所以有興趣探究正則表達(dá)式背后的世界,而不滿足于“夠用/湊合”,歸源都是受益于這種思維行為習(xí)慣。此外,在中小學(xué)階段,我的語文老師羅碧玉、郭志鴻、易璽銘培養(yǎng)了我對于文字的興趣,在大學(xué)階段,東北師范大學(xué)文學(xué)院的王確老師給了我這個(gè)理科生非常多的幫助和指引。對各位師長,在此一并表示感謝,能遇到你們是我的幸運(yùn)。
最后還需要感謝許多為這本書做出過貢獻(xiàn)的人,你們的名字我可能暫時(shí)無法記起,或者無法一一羅列,但我會(huì)在心中存留對你們的謝意。
- 大數(shù)據(jù)技術(shù)與應(yīng)用基礎(chǔ)
- 人工智能超越人類
- Getting Started with Clickteam Fusion
- Visual FoxPro 6.0數(shù)據(jù)庫與程序設(shè)計(jì)
- MicroPython Projects
- 城市道路交通主動(dòng)控制技術(shù)
- Windows內(nèi)核原理與實(shí)現(xiàn)
- RPA(機(jī)器人流程自動(dòng)化)快速入門:基于Blue Prism
- C語言寶典
- INSTANT Autodesk Revit 2013 Customization with .NET How-to
- 塊數(shù)據(jù)5.0:數(shù)據(jù)社會(huì)學(xué)的理論與方法
- Windows游戲程序設(shè)計(jì)基礎(chǔ)
- Android游戲開發(fā)案例與關(guān)鍵技術(shù)
- 影視后期編輯與合成
- 網(wǎng)絡(luò)安全與防護(hù)