基本信息
作者:余晟
出版社:電子工業出版社
ISBN:9787121165511
出版日期:2012 年5月
開本:16開
頁碼:336
版次:1-1
內容簡介
《正則指引》針對作者在開發中遇到的實際問題,以及其他開發人員諮詢的問題,總結出一套使用正則表達式解題的辦法,並通過具體的例子指導讀者拆解、分析問題。全書分為三大部分:第一部分主要講解正則表達式的基礎知識,涵蓋了常見正則表達式中的各種功能和結構;第二部分主要講解關於正則表達式的更深入的知識,詳細探討了編碼問題、匹配原理、解題思路;第三部分將之前介紹的各種知識落實到6種常用語言.net、java、javascript、php、python、ruby中,不但詳細介紹了語言中正則表達式的用法,更點明了版本之間的細微差異,既可以作為專門學習的教材,也可以作為有用的參考手冊。
《正則指引》適合經常需要進行文本處理(比如日誌分析或網路運維)的技術人員、熟悉常用開發語言的程式設計師,以及已經對正則表達式有一定了解的讀者閱讀。
目錄
《正則指引》
第一部分
第1章 字元組 2
1.1 普通字元組 2
1.2 關於python的基礎知識 4
1.3 普通字元組(續) 6
1.4 元字元與轉義 8
1.5 排除型字元組 10
1.6 字元組簡記法 12
1.7 字元組運算 14
1.8 posix字元組 15
第2章 量詞 17
2.1 一般形式 17
2.2 常用量詞 18
2.3 數據提取 21
2.4 點號 23
2.5 濫用點號的問題 23
2.6 忽略優先量詞 26
2.7 轉義 31
第3章 括弧 33
.3.1 分組 33
3.2 多選結構 39
3.3 引用分組 44
3.3.1 反向引用 48
3.3.2 各種引用的記法 50
3.3.3 命名分組 53
3.4 非捕獲分組 54
3.5 補充 55
3.5.1 轉義 55
3.5.2 url rewrite 56
3.5.3 一個例子 58
第4章 斷言 59
4.1 單詞邊界 59
4.2 行起始/結束位置 61
4.3 環視 68
4.4 補充 74
4.4.1 環視的價值 74
4.4.2 環視與分組編號 74
4.4.3 環視的支持程度 75
4.4.4 環視的組合 77
4.4.5 斷言和反向引用之間的關係 79
第5章 匹配模式 81
5.1 不區分大小寫模式 81
5.1.1 模式的指定方式 82
5.2 單行模式 84
5.3 多行模式 85
5.4 注釋模式 87
5.5 補充 88
5.5.1 更多的模式 88
5.5.2 修飾符的作用範圍 89
5.5.3 失效修飾符 90
5.5.4 模式與反向引用 90
5.5.5 衝突策略 91
5.5.6 哪種方式更好 92
第6章 其他 93
6.1 轉義 93
6.1.1 字元串轉義與正則轉義 93
6.1.2 元字元的轉義 97
6.1.3 徹底消除元字元的特殊含義 99
6.1.4 字元組中的轉義 101
6.2 正則表達式的處理形式 101
6.2.1 函式式處理 102
6.2.2 面向對象式處理 102
6.2.3 比較 103
6.2.4 執行緒安全性 104
6.3 表達式中的優先權 106
第二部分
第7章 unicode 110
7.1 關於編碼 110
7.2 推薦使用unicode編碼 111
7.3 unicode匹配規則 115
7.4 單詞邊界 117
7.5 碼值 119
7.6 unicode屬性 121
7.6.1 unicode property 121
7.6.2 unicode block 122
7.6.3 unicode script 123
7.7 unicode屬性列表 123
7.7.1 unicode property 123
7.7.2 unicode block 125
7.7.3 unicode script 128
7.8 posix字元組 129
第8章 匹配原理 130
8.1 有窮自動機 130
8.2 正則表達式的匹配過程 131
8.3 回溯 134
8.4 nfa和dfa 136
第9章 常見問題的解決思路 138
9.1 關於元素的三種邏輯 138
9.1.1 必須出現 139
9.1.2 可能出現 139
9.1.3 不能出現 140
9.2 正則表達式的常見操作 142
9.2.1 提取 142
9.2.2 驗證 148
9.2.3 替換 152
9.2.4 切分 157
9.3 正則表達式的最佳化建議 159
9.3.1 使用快取 159
9.3.2 儘量準確地表達意圖 160
9.3.3 避免重複匹配 160
9.3.4 獨立出文本和錨點 161
9.4 別過分依賴正則表達式 162
9.4.1 徹底放棄字元串操作 162
9.4.2 思維定勢 163
9.4.3 正則表達式可以匹配各種文本 164
第 三 部 分
第10章 .net 168
10.1 預備知識 168
10.2 正則功能詳解 169
10.2.1 列表 169
10.2.2 字元組 170
10.2.3 unicode屬性 170
10.2.4 字元組簡記法 171
10.2.5 單詞邊界 171
10.2.6 行起始/結束位置 172
10.2.7 環視 173
10.2.8 匹配模式 173
10.2.9 捕獲分組的引用 174
10.3 正則api簡介 175
10.3.1 RegEx 175
10.3.2 match 179
10.4 常用操作示例 180
10.4.1 驗證 180
10.4.2 提取 180
10.4.3 替換 181
10.4.4 切分 182
第11章 java 183
11.1 預備知識 183
11.2 正則功能詳解 184
11.2.1 列表 184
11.2.2 字元組 184
11.2.3 unicode屬性 186
11.2.4 字元組簡記法 186
11.2.5 單詞邊界 186
11.2.6 行起始/結束位置 187
11.2.7 環視 188
11.2.8 匹配模式 188
11.2.9 純文本模式 189
11.2.10 捕獲分組的引用 189
11.3 正則api簡介 189
11.3.1 pattern 190
11.3.2 matcher 192
11.3.3 string 194
11.4 常用操作示例 195
11.4.1 驗證 195
11.4.2 提取 196
11.4.3 替換 196
11.4.4 切分 197
第12章 javascript 198
12.1 預備知識 198
12.2 正則功能詳解 199
12.2.1 列表 199
12.2.2 字元組 199
12.2.3 字元組簡記法 200
12.2.4 單詞邊界 200
12.2.5 行起始/結束位置 201
12.2.6 環視 201
12.2.7 匹配模式 202
12.2.8 捕獲分組的引用 203
12.3 正則api簡介 203
12.3.1 RegExp 203
12.3.2 string 207
12.4 常用操作示例 210
12.4.1 驗證 210
12.4.2 提取 210
12.4.3 替換 211
12.4.4 切分 211
12.5 關於actionscript 211
12.5.1 regexp 211
12.5.2 匹配規則 212
12.5.3 匹配模式 212
12.5.4 正則api 212
第13章 php 213
13.1 預備知識 213
13.2 正則功能詳解 215
13.2.1 列表 215
13.2.2 字元組 216
13.2.3 unicode屬性 217
13.2.4 字元組簡記法 217
13.2.5 單詞邊界 217
13.2.6 行起始/結束位置 218
13.2.7 環視 219
13.2.8 匹配模式 219
13.2.9 純文本模式 220
13.2.10 捕獲分組的引用 220
13.3 正則api簡介 221
13.3.1 preg 常量說明 221
13.3.2 preg_quote 222
13.3.3 preg_ GREP 223
13.3.4 preg_match 223
13.3.5 preg_match_all 225
13.3.6 preg_ last_ error 227
13.3.7 preg_replace 227
13.3.8 preg_ replace_ callback 227
13.3.9 preg_ filter 228
13.3.10 preg_ split 229
13.4 常見的正則操作舉例 230
13.4.1 驗證 230
13.4.2 提取 230
13.4.3 替換 231
13.4.4 切分 232
第14章 python 233
14.1 預備知識 233
14.2 正則功能詳解 234
14.2.1 列表 234
14.2.2 字元組 235
14.2.3 unicode屬性 236
14.2.4 字元組簡記法 236
14.2.5 單詞邊界 238
14.2.6 行起始/結束位置 239
14.2.7 環視 239
14.2.8 匹配模式 240
14.2.9 捕獲分組的引用 240
14.3 正則api簡介 241
14.3.1 regexobject 241
14.3.2 re.compile(regex[, flags]) 243
14.3.3 re.search(pattern, string[, flags]) 243
14.3.4 matchobject 243
14.3.5 re.match(pattern, string[, flags]) 244
14.3.6 re.findall(pattern, sting[, flags]) 245
14.3.7 re.finditer(pattern, string[, flags]) 245
14.3.8 re.split(pattern, string[, maxsplit=0, flags=0]) 246
14.3.9 re.sub(pattern, repl, string[, count, flags]) 247
14.4 常用操作示例 248
14.4.1 驗證 248
14.4.2 提取 248
14.4.3 替換 249
14.4.4 切分 250
第15章 ruby 251
15.1 預備知識 251
15.2 正則功能詳解 252
15.2.1 列表 252
15.2.2 字元組 252
15.2.3 unicode屬性 253
15.2.4 字元組簡記法 254
15.2.5 單詞邊界 254
15.2.6 行起始/結束位置 255
15.2.7 環視 256
15.2.8 匹配模式 256
15.2.9 捕獲分組的引用 257
15.3 正則api簡介 257
15.3.1 regexp 257
15.3.2 regexp.match(text) 259
15.3.3 regexp.quote(text)和regexp.escape(text) 260
15.3.4 string.index(regexp) 261
15.3.5 string.scan(regexp) 261
15.3.6 string.slice(regexp) 262
15.3.7 string.split(regexp) 262
15.3.8 string.sub(regexp, str) 263
15.3.9 string.gsub(regexp, string) 264
15.4 常用操作示例 264
15.4.1 驗證 264
15.4.2 提取 265
15.4.3 替換 265
15.4.4 切分 265
15.5 ruby 1.9的新變化 266
第16章 linux/unix 268
16.1 posix 268
16.1.1 posix規範 268
16.1.2 posix字元組 269
16.2 vi 271
16.2.1 字元組及簡記法 271
16.2.2 量詞 272
16.2.3 多選結構和捕獲分組 272
16.2.4 環視 273
16.2.5 錨點和單詞邊界 273
16.2.6 替換操作的特殊字元 274
16.2.7 replacement中的特殊變數 276
16.2.8 補充 276
16.3 grep 277
16.3.1 基本用法 277
16.3.2 字元組 277
16.3.3 錨點和單詞邊界 278
16.3.4 量詞 278
16.3.5 多選結構和捕獲分組 279
16.3.6 options 279
16.3.7 egrep和fgrep 280
16.3.8 補充 280
16.4 awk 281
16.4.1 基本用法 281
16.4.2 字元組及簡記法 282
16.4.3 錨點和單詞邊界 283
16.4.4 量詞 283
16.4.5 多選結構 284
16.4.6 補充 284
16.5 sed 284
16.5.1 基本用法 284
16.5.2 字元組及簡記法 285
16.5.3 錨點和單詞邊界 285
16.5.4 量詞 286
16.5.5 多選結構和捕獲分組 286
16.5.6 options 286
16.5.7 補充 287
16.6 總結 288
附錄a 常用語言中正則特性一覽 291
附錄b 常用的正則表達式 293
附錄c 常用的正則表達式工具及資源 309
前言
提到正則表達式,許多人很有點不屑一顧:這東西,不登大雅之堂,再說也不是總要用到,何必專門花時間學習?
沒錯,正則表達式並不“總要用到”,但到了需要的場合用不上,往往產生“一分錢難倒英雄漢”的尷尬。經常需要處理文本的程式設計師自然會知道正則表達式的價值,其他的程式設計師如果不會正則表達式,即便開發的領域與文本處理沒什麼關係,也難免“躺著中槍”的命運——前幾天我遇到一個問題,將一行長長的地址拆分成多行,負責這部分的程式設計師的日常工作只是製作PDF而已,拆分地址是很“邊緣”的功能,但不會正則表達式就無法準確折行(一般需要在標點符號出現的地方折行,而不能只在空白字元處折行,但是不同語言中的標點符號各有不同),結果一籌莫展;相反,如果了解正則表達式,就可以很容易地處理各種語言中的標點字元。
以我的開發經驗來看,專門花點時間掌握正則表達式,確實是非常有必要的。目前可以見到的關於正則表達式的書籍和資料有不少,但又各有不足。
在網際網路上,流傳著一些程式語言的正則文檔和《30分鐘教會你正則表達式》之類的帖子。這類資料的好處是簡單直接,查到了,如果有現成的例子,而且適用於自己的語言,則可以直接拿來用;然而,其壞處也是簡單直接,因為缺乏背後原理的講解,如果找不到現成的例子,或者找不到能在自己所使用語言中行得通的例子(需知道,同樣的正則表達式並不能直接套用到不同的語言中),則束手無策。
在正式的出版領域,已經有《精通正則表達式》、《正則表達式必知必會》之類的書籍出版,尤其是前者,堪稱關於正則表達式的經典著作,如果想認真學習正則表達式,這類書籍是必須閱讀的。但這類書籍也有一個弱點,即都是由英文版本翻譯而來的,更多地側重英文文本的處理,身為中文世界的開發人員,我們經常需要處理中文文本——對於處理英文之外的字元,正則表達式已經提供了足夠豐富的功能,但如何用對、用好這些功能,資料卻很匱乏。
我經常需要給人講解正則表達式的相關知識,時常惋惜的是,開發人員為這些問題所困擾;正因為如此,本書的寫作動機便是著力彌補現有資料的缺陷。
相對於正則文檔和速成教學帖子,本書深入講解了匹配背後的原理,往往會舉一反三,告訴讀者,這裡為何這樣寫,如果改成其他形式,會造成什麼結構;並且,集中講解和比較了多種語言中正則表達式用法的異同,方便讀者把現成的正則表達式“移植”到自己的工作環境中。
相對於《精通正則表達式》等正式的書籍,本書辟出專門的內容講解語言和編碼,告訴讀者如何設定編碼,如何正確處理中文等字元。另外,本書還涵蓋了.NET、Java、JavaScript、PHP、Python、Ruby 六種常用語言,對每種語言給出專門章節,不但詳細介紹了語言中正則表達式的用法,更點明了版本之間的細微差異,不但可以作為專門學習的教材,還可以成為有用的參考手冊。
本書結構
本書可以分為三大部分。
第一部分主要講解正則表達式的基礎知識,覆蓋常見正則表達式中的各種功能和結構。看完前面3章,就可以基本弄明白現在流行的各種正則表達式;尤其是如果你之前有一些經驗,會覺得閱讀起來並不困難。但是我也希望讀者不要忽略其他的內容,斷言和匹配模式現在已經是正則表達式的“標準配備”了,而且確實可以派上大用場,所以第4章和第5章的內容,即便不是很熟悉,閱讀起來可能有一些麻煩,也不應該忽略。最後的第6章,則釐清了正則表達式在使用中的若干疑惑,了解它們,你就可以相對自由地在正則表達式的世界裡行走了。
第二部分主要講解關於正則表達式的更深入的知識,這一部分用3章的內容,詳細探討了編碼問題、匹配原理、解題思路。這部分內容更抽象,需要多花一點時間來閱讀和理解,但是它們確實可以幫你在正則表達式的世界裡登堂入室,脫離“術”的層面,掌握萬變不離其宗的“道”。
第三部分的作用是接地氣,將之前介紹的各種知識落實到六種常用語言.NET、Java、JavaScript、PHP、Python、Ruby中來。每一章的開頭有正則功能列表,其中的功能都對應著前面部分的講解,這些功能的具體套用實例,以及不同版本之間的差異,則在章節中詳細講解,每一章的最後還給出了常見任務的示例代碼,方便日後查詢。在最後,第16章簡要介紹了正則表達式在Linux下常用工具vi、grep、awk、sed中的使用,並通過一個實際的例子將這幾種工具串起來,對比說明了它們適合解決的問題。
在本書的最後提供了用作參考的3個附錄。
附錄A是正則表達式的常用功能在不同語言中的比對,希望能給需要在多種語言中使用正則表達式或者移植正則表達式的讀者提供一份有用的參考;附錄B給出了若干常見的正則表達式,比如匹配郵政編碼、身份證號、手機號、QQ號、電子郵件地址等,希望能成為常見問題的“速查手冊”;附錄C列出了常用正則表達式的工具和資源,方便大家調試自己的正則表達式,以及繼續深入學習。
本書讀者
本書適合以下幾類讀者。
經常需要進行文本處理(比如日誌分析或網路運維)的技術人員。這些讀者或許已經熟悉了正則表達式的基本用法,但面對日益複雜化和海量化的數據,閱讀本書可以幫助你更準確、更高效地處理文本,提升自己工作的價值。
熟悉常用開發語言的程式設計師。雖然這些讀者不需要專職進行文本處理,但原始碼和許多數據其實也是文本,如果不會正則表達式,在偶然遇到處理原始碼或文本數據的任務時,往往會產生躺著中槍的無力感。本書第三部分可以幫你迅速找到有關的例子,並落實在自己的程式語言中。當然前兩部分也非常有必要,因為它們可以幫你夯實基礎。
對正則表達式已經有一定了解的讀者。這些讀者雖然能用正則表達式解決常見的任務,但未必了解正則表達式的編碼問題、匹配原理、解題思路,仔細閱讀本書的第二部分,可以深化完善對正則表達式的理解;而第三部分詳細比較了使用正則表達式時各種語言,以及同一種語言中各種版本的差異。所有這一切,應該可以讓你對正則表達式的掌握更上一層樓。