出版時(shí)間:2012-5 出版社:電子工業(yè)出版社 作者:余晟 頁(yè)數(shù):336
Tag標(biāo)簽:無(wú)
前言
前 言 提到正則表達(dá)式,許多人很有點(diǎn)不屑一顧:這東西,不登大雅之堂,再說(shuō)也不是總要用到,何必專門(mén)花時(shí)間學(xué)習(xí)? 沒(méi)錯(cuò),正則表達(dá)式并不“總要用到”,但到了需要的場(chǎng)合用不上,往往產(chǎn)生“一分錢(qián)難倒英雄漢”的尷尬。經(jīng)常需要處理文本的程序員自然會(huì)知道正則表達(dá)式的價(jià)值,其他的程序員如果不會(huì)正則表達(dá)式,即便開(kāi)發(fā)的領(lǐng)域與文本處理沒(méi)什么關(guān)系,也難免“躺著中槍”的命運(yùn)--前幾天我遇到一個(gè)問(wèn)題,將一行長(zhǎng)長(zhǎng)的地址拆分成多行,負(fù)責(zé)這部分的程序員的日常工作只是制作PDF而已,拆分地址是很“邊緣”的功能,但不會(huì)正則表達(dá)式就無(wú)法準(zhǔn)確折行(一般需要在標(biāo)點(diǎn)符號(hào)出現(xiàn)的地方折行,而不能只在空白字符處折行,但是不同語(yǔ)言中的標(biāo)點(diǎn)符號(hào)各有不同),結(jié)果一籌莫展;相反,如果了解正則表達(dá)式,就可以很容易地處理各種語(yǔ)言中的標(biāo)點(diǎn)字符?! ∫晕业拈_(kāi)發(fā)經(jīng)驗(yàn)來(lái)看,專門(mén)花點(diǎn)時(shí)間掌握正則表達(dá)式,確實(shí)是非常有必要的。目前可以見(jiàn)到的關(guān)于正則表達(dá)式的書(shū)籍和資料有不少,但又各有不足。 在互聯(lián)網(wǎng)上,流傳著一些編程語(yǔ)言的正則文檔和《30分鐘教會(huì)你正則表達(dá)式》之類的帖子。這類資料的好處是簡(jiǎn)單直接,查到了,如果有現(xiàn)成的例子,而且適用于自己的語(yǔ)言,則可以直接拿來(lái)用;然而,其壞處也是簡(jiǎn)單直接,因?yàn)槿狈Ρ澈笤淼闹v解,如果找不到現(xiàn)成的例子,或者找不到能在自己所使用語(yǔ)言中行得通的例子(需知道,同樣的正則表達(dá)式并不能直接套用到不同的語(yǔ)言中),則束手無(wú)策?! ≡谡降某霭骖I(lǐng)域,已經(jīng)有《精通正則表達(dá)式》、《正則表達(dá)式必知必會(huì)》之類的書(shū)籍出版,尤其是前者,堪稱關(guān)于正則表達(dá)式的經(jīng)典著作,如果想認(rèn)真學(xué)習(xí)正則表達(dá)式,這類書(shū)籍是必須閱讀的。但這類書(shū)籍也有一個(gè)弱點(diǎn),即都是由英文版本翻譯而來(lái)的,更多地側(cè)重英文文本的處理,身為中文世界的開(kāi)發(fā)人員,我們經(jīng)常需要處理中文文本--對(duì)于處理英文之外的字符,正則表達(dá)式已經(jīng)提供了足夠豐富的功能,但如何用對(duì)、用好這些功能,資料卻很匱乏?! ∥医?jīng)常需要給人講解正則表達(dá)式的相關(guān)知識(shí),時(shí)常惋惜的是,開(kāi)發(fā)人員為這些問(wèn)題所困擾;正因?yàn)槿绱?,本?shū)的寫(xiě)作動(dòng)機(jī)便是著力彌補(bǔ)現(xiàn)有資料的缺陷?! ∠鄬?duì)于正則文檔和速成教學(xué)帖子,本書(shū)深入講解了匹配背后的原理,往往會(huì)舉一反三,告訴讀者,這里為何這樣寫(xiě),如果改成其他形式,會(huì)造成什么結(jié)構(gòu);并且,集中講解和比較了多種語(yǔ)言中正則表達(dá)式用法的異同,方便讀者把現(xiàn)成的正則表達(dá)式“移植”到自己的工作環(huán)境中。 相對(duì)于《精通正則表達(dá)式》等正式的書(shū)籍,本書(shū)辟出專門(mén)的內(nèi)容講解語(yǔ)言和編碼,告訴讀者如何設(shè)定編碼,如何正確處理中文等字符。另外,本書(shū)還涵蓋了.NET、Java、JavaScript、PHP、Python、Ruby 六種常用語(yǔ)言,對(duì)每種語(yǔ)言給出專門(mén)章節(jié),不但詳細(xì)介紹了語(yǔ)言中正則表達(dá)式的用法,更點(diǎn)明了版本之間的細(xì)微差異,不但可以作為專門(mén)學(xué)習(xí)的教材,還可以成為有用的參考手冊(cè)?! ”緯?shū)結(jié)構(gòu) 本書(shū)可以分為三大部分?! 〉谝徊糠种饕v解正則表達(dá)式的基礎(chǔ)知識(shí),覆蓋常見(jiàn)正則表達(dá)式中的各種功能和結(jié)構(gòu)??赐昵懊?章,就可以基本弄明白現(xiàn)在流行的各種正則表達(dá)式;尤其是如果你之前有一些經(jīng)驗(yàn),會(huì)覺(jué)得閱讀起來(lái)并不困難。但是我也希望讀者不要忽略其他的內(nèi)容,斷言和匹配模式現(xiàn)在已經(jīng)是正則表達(dá)式的“標(biāo)準(zhǔn)配備”了,而且確實(shí)可以派上大用場(chǎng),所以第4章和第5章的內(nèi)容,即便不是很熟悉,閱讀起來(lái)可能有一些麻煩,也不應(yīng)該忽略。最后的第6章,則厘清了正則表達(dá)式在使用中的若干疑惑,了解它們,你就可以相對(duì)自由地在正則表達(dá)式的世界里行走了?! 〉诙糠种饕v解關(guān)于正則表達(dá)式的更深入的知識(shí),這一部分用3章的內(nèi)容,詳細(xì)探討了編碼問(wèn)題、匹配原理、解題思路。這部分內(nèi)容更抽象,需要多花一點(diǎn)時(shí)間來(lái)閱讀和理解,但是它們確實(shí)可以幫你在正則表達(dá)式的世界里登堂入室,脫離“術(shù)”的層面,掌握萬(wàn)變不離其宗的“道”?! 〉谌糠值淖饔檬墙拥貧猓瑢⒅敖榻B的各種知識(shí)落實(shí)到六種常用語(yǔ)言.NET、Java、JavaScript、PHP、Python、Ruby中來(lái)。每一章的開(kāi)頭有正則功能列表,其中的功能都對(duì)應(yīng)著前面部分的講解,這些功能的具體應(yīng)用實(shí)例,以及不同版本之間的差異,則在章節(jié)中詳細(xì)講解,每一章的最后還給出了常見(jiàn)任務(wù)的示例代碼,方便日后查詢。在最后,第16章簡(jiǎn)要介紹了正則表達(dá)式在Linux下常用工具vi、grep、awk、sed中的使用,并通過(guò)一個(gè)實(shí)際的例子將這幾種工具串起來(lái),對(duì)比說(shuō)明了它們適合解決的問(wèn)題。 在本書(shū)的最后提供了用作參考的3個(gè)附錄?! 「戒汚是正則表達(dá)式的常用功能在不同語(yǔ)言中的比對(duì),希望能給需要在多種語(yǔ)言中使用正則表達(dá)式或者移植正則表達(dá)式的讀者提供一份有用的參考;附錄B給出了若干常見(jiàn)的正則表達(dá)式,比如匹配郵政編碼、身份證號(hào)、手機(jī)號(hào)、QQ號(hào)、電子郵件地址等,希望能成為常見(jiàn)問(wèn)題的“速查手冊(cè)”;附錄C列出了常用正則表達(dá)式的工具和資源,方便大家調(diào)試自己的正則表達(dá)式,以及繼續(xù)深入學(xué)習(xí)。 本書(shū)讀者 本書(shū)適合以下幾類讀者?! 〗?jīng)常需要進(jìn)行文本處理(比如日志分析或網(wǎng)絡(luò)運(yùn)維)的技術(shù)人員。這些讀者或許已經(jīng)熟悉了正則表達(dá)式的基本用法,但面對(duì)日益復(fù)雜化和海量化的數(shù)據(jù),閱讀本書(shū)可以幫助你更準(zhǔn)確、更高效地處理文本,提升自己工作的價(jià)值。 熟悉常用開(kāi)發(fā)語(yǔ)言的程序員。雖然這些讀者不需要專職進(jìn)行文本處理,但源代碼和許多數(shù)據(jù)其實(shí)也是文本,如果不會(huì)正則表達(dá)式,在偶然遇到處理源代碼或文本數(shù)據(jù)的任務(wù)時(shí),往往會(huì)產(chǎn)生躺著中槍的無(wú)力感。本書(shū)第三部分可以幫你迅速找到有關(guān)的例子,并落實(shí)在自己的編程語(yǔ)言中。當(dāng)然前兩部分也非常有必要,因?yàn)樗鼈兛梢詭湍愫粚?shí)基礎(chǔ)?! ?duì)正則表達(dá)式已經(jīng)有一定了解的讀者。這些讀者雖然能用正則表達(dá)式解決常見(jiàn)的任務(wù),但未必了解正則表達(dá)式的編碼問(wèn)題、匹配原理、解題思路,仔細(xì)閱讀本書(shū)的第二部分,可以深化完善對(duì)正則表達(dá)式的理解;而第三部分詳細(xì)比較了使用正則表達(dá)式時(shí)各種語(yǔ)言,以及同一種語(yǔ)言中各種版本的差異。所有這一切,應(yīng)該可以讓你對(duì)正則表達(dá)式的掌握更上一層樓?! ≈轮x 一本書(shū)的完成,必然離不開(kāi)眾多人的幫忙?! ∈紫刃枰兄x的是周筠老師和徐定翔、盧鶇翔兩位編輯,他們?cè)谖覍?xiě)作的最初階段做了大量細(xì)心、耐心的工作,完全可以說(shuō),沒(méi)有他們的這些工作,我就不會(huì)有寫(xiě)作這本書(shū)的念頭,或者堅(jiān)持寫(xiě)完的動(dòng)力?! ∪缓笠兄x的是電子工業(yè)出版社的楊福平副總編和張?jiān)缕季庉嫞瑳](méi)有他們的關(guān)照和辛勞工作,這本書(shū)的出版定然會(huì)遇到更多的困難?! 「兄x我的朋友霍炬和韓磊,雖然我之前閱讀過(guò)《精通正則表達(dá)式》,但與翻譯和寫(xiě)作結(jié)緣,他們給了我莫大的幫助,有了這個(gè)契機(jī),才有了現(xiàn)在的《正則指引》。尤其值得一提的是霍炬的夫人西喬,精心手繪了這本書(shū)的封面,在這里表示誠(chéng)摯的謝意?! 「兄x我曾工作過(guò)的盛大創(chuàng)新院以及創(chuàng)新院的各位同事(李駿、郝培強(qiáng)、莊表偉、丁宇、許式偉、莫華楓、李道兵、趙劼、樊一鵬、張一寧等),創(chuàng)新院給了大家寬松自由的工作環(huán)境,與各位同事的討論加深了我對(duì)正則表達(dá)式的理解,也為我提供了許多例子?! 「兄x張東亮、陸亦斌、孫勇、葉勁峰等各位朋友,愿意撥冗閱讀本書(shū)的草稿,并提出了大量專業(yè)的意見(jiàn)?! 「兄x何源、陳鋼、賀鈞、陳馳等讀者,試讀本書(shū)之后提出了大量的寶貴意見(jiàn),在最后關(guān)頭打消了我心中的許多忐忑?! ≡诟缰埃业母改笍男【凸膭?lì)我研究和了解各種科學(xué)原理(“玩也要?jiǎng)幽X筋”),我之所以有興趣探究正則表達(dá)式背后的世界,而不滿足于“夠用/湊合”,歸源都是受益于這種思維行為習(xí)慣。此外,在中小學(xué)階段,我的語(yǔ)文老師羅碧玉、郭志鴻、易璽銘培養(yǎng)了我對(duì)于文字的興趣,在大學(xué)階段,東北師范大學(xué)文學(xué)院的王確老師給了我這個(gè)理科生非常多的幫助和指引。對(duì)各位師長(zhǎng),在此一并表示感謝,能遇到你們是我的幸運(yùn)。 最后還需要感謝許多為這本書(shū)做出過(guò)貢獻(xiàn)的人,你們的名字我可能暫時(shí)無(wú)法記起,或者無(wú)法一一羅列,但我會(huì)在心中存留對(duì)你們的謝意。
內(nèi)容概要
《正則指引》針對(duì)作者在開(kāi)發(fā)中遇到的實(shí)際問(wèn)題,以及其他開(kāi)發(fā)人員咨詢的問(wèn)題,總結(jié)出一套使用正則表達(dá)式解題的辦法,并通過(guò)具體的例子指導(dǎo)讀者拆解、分析問(wèn)題。全書(shū)分為三大部分:第一部分主要講解正則表達(dá)式的基礎(chǔ)知識(shí),涵蓋了常見(jiàn)正則表達(dá)式中的各種功能和結(jié)構(gòu);第二部分主要講解關(guān)于正則表達(dá)式的更深入的知識(shí),詳細(xì)探討了編碼問(wèn)題、匹配原理、解題思路;第三部分將之前介紹的各種知識(shí)落實(shí)到6種常用語(yǔ)言.NET、Java、JavaScript、PHP、Python、Ruby中,不但詳細(xì)介紹了語(yǔ)言中正則表達(dá)式的用法,更點(diǎn)明了版本之間的細(xì)微差異,既可以作為專門(mén)學(xué)習(xí)的教材,也可以作為有用的參考手冊(cè)。
本書(shū)適合經(jīng)常需要進(jìn)行文本處理(比如日志分析或網(wǎng)絡(luò)運(yùn)維)的技術(shù)人員、熟悉常用開(kāi)發(fā)語(yǔ)言的程序員,以及已經(jīng)對(duì)正則表達(dá)式有一定了解的讀者閱讀。
作者簡(jiǎn)介
余晟,畢業(yè)于計(jì)算機(jī)系,副修中文,非正統(tǒng)型技術(shù)愛(ài)好者。曾任抓蝦網(wǎng)、銀杏泰克主力程序員,盛大創(chuàng)新院高級(jí)研究員,現(xiàn)任華南某電商公司技術(shù)部總監(jiān)。堅(jiān)信計(jì)算機(jī)可以無(wú)限延伸人的能力,前提是人必須理解計(jì)算機(jī)的邏輯,所以對(duì)任何技術(shù)都不應(yīng)該淺嘗輒止,僅僅滿足于“會(huì)用”。
已經(jīng)翻譯出版《精通正則表達(dá)式(第3版)》和《技術(shù)領(lǐng)導(dǎo)之路》,審閱《軟件架構(gòu)師應(yīng)該知道的97件事》和《REST in
Practice中文版》。
書(shū)籍目錄
第一部 分
第1章 字符組
1.1 普通字符組
1.2 關(guān)于Python的基礎(chǔ)知識(shí)
1.3 普通字符組(續(xù))
1.4 元字符與轉(zhuǎn)義
1.5 排除型字符組
1.6 字符組簡(jiǎn)記法
1.7 字符組運(yùn)算
1.8 POSIX字符組
第2章 量詞
2.1 一般形式
2.2 常用量詞
2.3 數(shù)據(jù)提取
2.4 點(diǎn)號(hào)
2.5 濫用點(diǎn)號(hào)的問(wèn)題
2.6 忽略優(yōu)先量詞
2.7 轉(zhuǎn)義
第3章 括號(hào)
3.1 分組
3.2 多選結(jié)構(gòu)
3.3 引用分組
3.3.1 反向引用
3.3.2 各種引用的記法
3.3.3 命名分組
3.4 非捕獲分組
3.5 補(bǔ)充
3.5.1 轉(zhuǎn)義
3.5.2 URL Rewrite
3.5.3 一個(gè)例子
第4章 斷言
4.1 單詞邊界
4.2 行起始/結(jié)束位置
4.3 環(huán)視
4.4 補(bǔ)充
4.4.1 環(huán)視的價(jià)值
4.4.2 環(huán)視與分組編號(hào)
4.4.3 環(huán)視的支持程度
4.4.4 環(huán)視的組合
4.4.5 斷言和反向引用之間的關(guān)系
第5章 匹配模式
5.1 不區(qū)分大小寫(xiě)模式
5.1.1 模式的指定方式
5.2 單行模式
5.3 多行模式
5.4 注釋模式
5.5 補(bǔ)充
5.5.1 更多的模式
5.5.2 修飾符的作用范圍
5.5.3 失效修飾符
5.5.4 模式與反向引用
5.5.5 沖突策略
5.5.6 哪種方式更好
第6章 其他
6.1 轉(zhuǎn)義
6.1.1 字符串轉(zhuǎn)義與正則轉(zhuǎn)義
6.1.2 元字符的轉(zhuǎn)義
6.1.3 徹底消除元字符的特殊含義
6.1.4 字符組中的轉(zhuǎn)義
6.2 正則表達(dá)式的處理形式
6.2.1 函數(shù)式處理
6.2.2 面向?qū)ο笫教幚?br />6.2.3 比較
6.2.4 線程安全性
6.3 表達(dá)式中的優(yōu)先級(jí)
第二部 分
第7章 Unicode
7.1 關(guān)于編碼
7.2 推薦使用Unicode編碼
7.3 Unicode匹配規(guī)則
7.4 單詞邊界
7.5 碼值
7.6 Unicode屬性
7.6.1 Unicode Property
7.6.2 Unicode Block
7.6.3 Unicode Script
7.7 Unicode屬性列表
7.7.1 Unicode Property
7.7.2 Unicode Block
7.7.3 Unicode Script
7.8 POSIX字符組
第8章 匹配原理
8.1 有窮自動(dòng)機(jī)
8.2 正則表達(dá)式的匹配過(guò)程
8.3 回溯
8.4 NFA和DFA
第9章 常見(jiàn)問(wèn)題的解決思路
9.1 關(guān)于元素的三種邏輯
9.1.1 必須出現(xiàn)
9.1.2 可能出現(xiàn)
9.1.3 不能出現(xiàn)
9.2 正則表達(dá)式的常見(jiàn)操作
9.2.1 提取
9.2.2 驗(yàn)證
9.2.3 替換
9.2.4 切分
9.3 正則表達(dá)式的優(yōu)化建議
9.3.1 使用緩存
9.3.2 盡量準(zhǔn)確地表達(dá)意圖
9.3.3 避免重復(fù)匹配
9.3.4 獨(dú)立出文本和錨點(diǎn)
9.4 別過(guò)分依賴正則表達(dá)式
9.4.1 徹底放棄字符串操作
9.4.2 思維定勢(shì)
9.4.3 正則表達(dá)式可以匹配各種文本
第三部 分
第10章 .NET
10.1 預(yù)備知識(shí)
10.2 正則功能詳解
10.2.1 列表
10.2.2 字符組
10.2.3 Unicode屬性
10.2.4 字符組簡(jiǎn)記法
10.2.5 單詞邊界
10.2.6 行起始/結(jié)束位置
10.2.7 環(huán)視
10.2.8 匹配模式
10.2.9 捕獲分組的引用
10.3 正則API簡(jiǎn)介
10.3.1 Regex
10.3.2 Match
10.4 常用操作示例
10.4.1 驗(yàn)證
10.4.2 提取
10.4.3 替換
10.4.4 切分
第11章 Java
11.1 預(yù)備知識(shí)
11.2 正則功能詳解
11.2.1 列表
11.2.2 字符組
11.2.3 Unicode屬性
11.2.4 字符組簡(jiǎn)記法
11.2.5 單詞邊界
11.2.6 行起始/結(jié)束位置
11.2.7 環(huán)視
11.2.8 匹配模式
11.2.9 純文本模式
11.2.10 捕獲分組的引用
11.3 正則API簡(jiǎn)介
11.3.1 Pattern
11.3.2 Matcher
11.3.3 String
11.4 常用操作示例
11.4.1 驗(yàn)證
11.4.2 提取
11.4.3 替換
11.4.4 切分
第12章 JavaScript
12.1 預(yù)備知識(shí)
12.2 正則功能詳解
12.2.1 列表
12.2.2 字符組
12.2.3 字符組簡(jiǎn)記法
12.2.4 單詞邊界
12.2.5 行起始/結(jié)束位置
12.2.6 環(huán)視
12.2.7 匹配模式
12.2.8 捕獲分組的引用
12.3 正則API簡(jiǎn)介
12.3.1 RegExp
12.3.2 String
12.4 常用操作示例
12.4.1 驗(yàn)證
12.4.2 提取
12.4.3 替換
12.4.4 切分
12.5 關(guān)于ActionScript
12.5.1 RegExp
12.5.2 匹配規(guī)則
12.5.3 匹配模式
12.5.4 正則API
第13章 PHP
13.1 預(yù)備知識(shí)
13.2 正則功能詳解
13.2.1 列表
13.2.2 字符組
13.2.3 Unicode屬性
13.2.4 字符組簡(jiǎn)記法
13.2.5 單詞邊界
13.2.6 行起始/結(jié)束位置
13.2.7 環(huán)視
13.2.8 匹配模式
13.2.9 純文本模式
13.2.10 捕獲分組的引用
13.3 正則API簡(jiǎn)介
13.3.1 PREG 常量說(shuō)明
13.3.2 preg_quote
13.3.3 preg_ grep
13.3.4 preg_match
13.3.5 preg_match_all
13.3.6 preg_ last_ error
13.3.7 preg_replace
13.3.8 preg_ replace_ callback
13.3.9 preg_ filter
13.3.10 preg_ split
13.4 常見(jiàn)的正則操作舉例
13.4.1 驗(yàn)證
13.4.2 提取
13.4.3 替換
13.4.4 切分
第14章 Python
14.1 預(yù)備知識(shí)
14.2 正則功能詳解
14.2.1 列表
14.2.2 字符組
14.2.3 Unicode屬性
14.2.4 字符組簡(jiǎn)記法
14.2.5 單詞邊界
14.2.6 行起始/結(jié)束位置
14.2.7 環(huán)視
14.2.8 匹配模式
14.2.9 捕獲分組的引用
14.3 正則API簡(jiǎn)介
14.3.1 RegexObject
14.3.2 re.compile(regex[, flags])
14.3.3 re.search(pattern, string[, flags])
14.3.4 MatchObject
14.3.5 re.match(pattern, string[, flags])
14.3.6 re.findall(pattern, sting[, flags])
14.3.7 re.finditer(pattern, string[, flags])
14.3.8 re.split(pattern, string[, maxsplit=0, flags=0])
14.3.9 re.sub(pattern, repl, string[, count, flags])
14.4 常用操作示例
14.4.1 驗(yàn)證
14.4.2 提取
14.4.3 替換
14.4.4 切分
第15章 Ruby
15.1 預(yù)備知識(shí)
15.2 正則功能詳解
15.2.1 列表
15.2.2 字符組
15.2.3 Unicode屬性
15.2.4 字符組簡(jiǎn)記法
15.2.5 單詞邊界
15.2.6 行起始/結(jié)束位置
15.2.7 環(huán)視
15.2.8 匹配模式
15.2.9 捕獲分組的引用
15.3 正則API簡(jiǎn)介
15.3.1 Regexp
15.3.2 Regexp.match(text)
15.3.3 Regexp.quote(text)和Regexp.escape(text)
15.3.4 String.index(Regexp)
15.3.5 String.scan(Regexp)
15.3.6 String.slice(Regexp)
15.3.7 String.split(Regexp)
15.3.8 String.sub(Regexp, Str)
15.3.9 String.gsub(Regexp, String)
15.4 常用操作示例
15.4.1 驗(yàn)證
15.4.2 提取
15.4.3 替換
15.4.4 切分
15.5 Ruby 1.9的新變化
第16章 Linux/UNIX
16.1 POSIX
16.1.1 POSIX規(guī)范
16.1.2 POSIX字符組
16.2 vi
16.2.1 字符組及簡(jiǎn)記法
16.2.2 量詞
16.2.3 多選結(jié)構(gòu)和捕獲分組
16.2.4 環(huán)視
16.2.5 錨點(diǎn)和單詞邊界
16.2.6 替換操作的特殊字符
16.2.7 replacement中的特殊變量
16.2.8 補(bǔ)充
16.3 grep
16.3.1 基本用法
16.3.2 字符組
16.3.3 錨點(diǎn)和單詞邊界
16.3.4 量詞
16.3.5 多選結(jié)構(gòu)和捕獲分組
16.3.6 options
16.3.7 egrep和fgrep
16.3.8 補(bǔ)充
16.4 awk
16.4.1 基本用法
16.4.2 字符組及簡(jiǎn)記法
16.4.3 錨點(diǎn)和單詞邊界
16.4.4 量詞
16.4.5 多選結(jié)構(gòu)
16.4.6 補(bǔ)充
16.5 sed
16.5.1 基本用法
16.5.2 字符組及簡(jiǎn)記法
16.5.3 錨點(diǎn)和單詞邊界
16.5.4 量詞
16.5.5 多選結(jié)構(gòu)和捕獲分組
16.5.6 options
16.5.7 補(bǔ)充
16.6 總結(jié)
附錄A 常用語(yǔ)言中正則特性一覽
附錄B 常用的正則表達(dá)式
附錄C 常用的正則表達(dá)式工具及資源
章節(jié)摘錄
版權(quán)頁(yè): 插圖: 第1章 字符組 1.1 普通字符組 字符組(Character Class)是正則表達(dá)式最基本的結(jié)構(gòu)之一,要理解正則表達(dá)式的“靈活”,認(rèn)識(shí)它是第一步。 顧名思義,字符組就是一組字符,在正則表達(dá)式中,它表示“在同一個(gè)位置可能出現(xiàn)的各種字符”,其寫(xiě)法是在一對(duì)方括號(hào)【和】之間列出所有可能出現(xiàn)的字符,簡(jiǎn)單的字符組比如[ab]、[314】、【#.?】在解決一些常見(jiàn)問(wèn)題時(shí),使用字符組可以大大簡(jiǎn)化操作,下面舉“匹配數(shù)字字符”的例子來(lái)說(shuō)明。 字符可以分為很多類,比如數(shù)字、字母、標(biāo)點(diǎn)等。有時(shí)候要求“只出現(xiàn)一個(gè)數(shù)字字符”,換句話說(shuō),這個(gè)位置上的字符只能是0、1、2、…、8、9這10個(gè)字符之一。要進(jìn)行這種判斷,通常的思路是:用10個(gè)條件分別判斷字符是否等于這10個(gè)字符,對(duì)10個(gè)結(jié)果取“或”,只要其中一個(gè)條件成立,就返回True,表示這是一個(gè)數(shù)字字符,其偽代碼如例1—1所示。 例1—1判斷數(shù)字字符的偽代碼 charStr=="0"||charStr=="1"…||charStr=="9" 注:因?yàn)檎齽t表達(dá)式處理的都是"字符串"(String)而不是”字符”,所以這里假設(shè)變量charStr(雖然它只包含一個(gè)字符)也是字符串類型,使用了雙引號(hào),在有些語(yǔ)言中字符串也用單引號(hào)表示。 這種解法的問(wèn)題在于太煩瑣——如果要判斷是否是一個(gè)小寫(xiě)英文字母,就要用||連接26個(gè)判斷;如果還要兼容大寫(xiě)字母,則要連接52個(gè)判斷,代碼長(zhǎng)到幾乎無(wú)法閱讀。相反,用字符組解決起來(lái)卻異常簡(jiǎn)單,具體思路是:列出可能出現(xiàn)的所有字符(在這個(gè)例子里就是10個(gè)數(shù)字字符),只要出現(xiàn)了其中任何一個(gè),就返回True。例1—2給出了使用字符組判斷的例子,程序語(yǔ)言使用Python。 例1—2 用正則表達(dá)式判斷數(shù)字字符 re.search("[8123456789]¨,charStr)!=None re.search()是Python提供的正則表達(dá)式操作函數(shù),表示“進(jìn)行正則表達(dá)式匹配”;charStr仍然是需要判斷的字符串,而[01234S6789】則是以字符串形式給出的正則表達(dá)式,它是一個(gè)字符組,表示“這里可以是0、1、2、…、8、9中的任意一個(gè)字符。只要charStr與其中任何一個(gè)字符相同(或者說(shuō)“charStr可以由【0123456789】匹配”),就會(huì)得到一個(gè)Matchobject對(duì)象(這個(gè)對(duì)象暫時(shí)不必關(guān)心,在第21頁(yè)會(huì)詳細(xì)講解);否則,返回None。所以判斷結(jié)果是否為None,就可以判斷charStr是否是數(shù)字字符。 當(dāng)今流行的編程語(yǔ)言大多支持正則表達(dá)式,上面的例子在各種語(yǔ)言中的寫(xiě)法大抵相同,唯一的區(qū)別在于如何調(diào)用正則表達(dá)式的功能,所以用法其實(shí)大同小異。例1—3列出了常見(jiàn)語(yǔ)言中的表示,如果你現(xiàn)在就希望知道語(yǔ)言的細(xì)節(jié),可以參考本書(shū)第三部分的具體章節(jié)。
編輯推薦
《正則指引》適合經(jīng)常需要進(jìn)行文本處理(比如日志分析或網(wǎng)絡(luò)運(yùn)維)的技術(shù)人員、熟悉常用開(kāi)發(fā)語(yǔ)言的程序員,以及已經(jīng)對(duì)正則表達(dá)式有一定了解的讀者閱讀。
名人推薦
掌握正則表達(dá)式應(yīng)該是IT工程師的一項(xiàng)標(biāo)準(zhǔn)技能,遺憾的是,過(guò)去,不少人多多少少忽視了這一點(diǎn),所以在工作中總要應(yīng)對(duì)正則表達(dá)式帶來(lái)的【麻煩】。 我相信只有掌握并熟練運(yùn)用它才有可能成為一個(gè)高效率的工程師。期待每個(gè)人手邊都有一本正則表達(dá)式的參考書(shū),當(dāng)然,最好就是你現(xiàn)在看到的這本。 就在寫(xiě)這句話的幾分鐘前,我又從這本書(shū)中學(xué)到了一個(gè)有用的技巧。 ——馮大輝 配合恰當(dāng)?shù)陌咐?,大量的反?wèn),使讀者自問(wèn)、思考,扣人心扉,比較有代入感。加上配圖,很容易讓讀者全面認(rèn)識(shí)正則表達(dá)式。在原理講解的章節(jié),對(duì)比兩種理論模型的區(qū)別,順其自然地引入NFA引擎的關(guān)鍵要素:回溯。使讀者從匹配原理上了解回溯,寫(xiě)出高效、嚴(yán)謹(jǐn)?shù)恼齽t表達(dá)式。 ——陳馳 本書(shū)由淺入深地講述了正則表達(dá)式,在正則的應(yīng)用和調(diào)優(yōu)方面有非常詳細(xì)的介紹,特別在正則表達(dá)式處理中文方面有獨(dú)到的闡述。對(duì)于需要經(jīng)常處理中文的國(guó)內(nèi)技術(shù)人員來(lái)說(shuō),無(wú)疑是非常值得擁有的一本手冊(cè)。 ——賀鈞 正則表達(dá)式是程序員的必備知識(shí)。如果您還沒(méi)有使用過(guò)這個(gè)強(qiáng)大的工具,或者學(xué)習(xí)正則表達(dá)式總不得要領(lǐng)。確實(shí)可以讀讀《正則指引》。 ——何源 這是一本通俗版的“精通正則表達(dá)式”。高手很難挑出毛病,一般程序員會(huì)受益匪淺,普通用戶一步步讀下去也能登堂入室。 ——張東亮 余晟在之前翻譯業(yè)內(nèi)名著的基礎(chǔ)上,結(jié)合中文環(huán)境和自己的豐富經(jīng)驗(yàn),再接再厲推出自己的原創(chuàng)著作,實(shí)在是我等碼農(nóng)的一大幸事。 ——陳鋼
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版