标题：正则指引
基本信息
作者：余晟  
出版社：电子工业出版社 
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列出了常用正则表达式的工具和资源，方便大家调试自己的正则表达式，以及继续深入学习。 
本书读者 
本书适合以下几类读者。 
经常需要进行文本处理（比如日志分析或网络运维）的技术人员。这些读者或许已经熟悉了正则表达式的基本用法，但面对日益复杂化和海量化的数据，阅读本书可以帮助你更准确、更高效地处理文本，提升自己工作的价值。 
熟悉常用开发语言的程序员。虽然这些读者不需要专职进行文本处理，但源代码和许多数据其实也是文本，如果不会正则表达式，在偶然遇到处理源代码或文本数据的任务时，往往会产生躺着中枪的无力感。本书第三部分可以帮你迅速找到有关的例子，并落实在自己的编程语言中。当然前两部分也非常有必要，因为它们可以帮你夯实基础。 
对正则表达式已经有一定了解的读者。这些读者虽然能用正则表达式解决常见的任务，但未必了解正则表达式的编码问题、匹配原理、解题思路，仔细阅读本书的第二部分，可以深化完善对正则表达式的理解；而第三部分详细比较了使用正则表达式时各种语言，以及同一种语言中各种版本的差异。所有这一切，应该可以让你对正则表达式的掌握更上一层楼。