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