第1章 正则表达式入门 1
1.1 正则表达式的用途 1
1.2 如何使用正则表达式 2
1.2.1 用正则表达式进行搜索 3
1.2.2 用正则表达式进行替换 3
1.3 什么是正则表达式 4
1.4 使用正则表达式 5
1.5 在继续学习之前 6
1.6 小结 6
第2章 匹配单个字符 7
2.1 匹配纯文本 7
2.1.1 有多个匹配结果 8
2.1.2 字母的大小写问题 8
2.2 匹配任意字符 9
2.3 匹配特殊字符 12
2.4 小结 14
第3章 匹配一组字符 15
3.1 匹配多个字符中的某一个 15
3.2 利用字符集合区间 17
3.3 取非匹配 21
3.4 小结 22
第4章 使用元字符 23
4.1 对特殊字符进行转义 23
4.2 匹配空白字符 26
4.3 匹配特定的字符类别 28
4.3.1 匹配数字(与非数字) 28
4.3.2 匹配字母和数字(与非字母和数字) 29
4.3.3 匹配空白字符(与非空白字符) 31
4.3.4 匹配十六进制或八进制数值 31
4.4 使用POSIX字符类 32
4.5 小结 34
第5章 重复匹配 35
5.1 有多少个匹配 35
5.1.1 匹配一个或多个字符 36
5.1.2 匹配零个或多个字符 39
5.1.3 匹配零个或一个字符 41
5.2 匹配的重复次数 43
5.2.1 为重复匹配次数设定一个精确的值 44
5.2.2 为重复匹配次数设定一个区间 45
5.2.3 匹配“至少重复多少次” 46
5.3 防止过度匹配 47
5.4 小结 49
第6章 位置匹配 50
6.1 边界 50
6.2 单词边界 51
6.3 字符串边界 54
6.4 小结 59
第7章 使用子表达式 60
7.1 什么是子表达式 60
7.2 子表达式 61
7.3 子表达式的嵌套 65
7.4 小结 67
第8章 回溯引用:前后一致匹配 68
8.1 回溯引用有什么用 68
8.2 回溯引用匹配 71
8.3 回溯引用在替换操作中的应用 74
8.4 小结 79
第9章 前后查找 80
9.1 前后查找 80
9.2 向前查找 81
9.3 向后查找 83
9.4 把向前查找和向后查找结合起来 86
9.5 对前后查找取非 87
9.6 小结 89
第10章 嵌入条件 90
10.1 为什么要嵌入条件 90
10.2 正则表达式里的条件 91
10.2.1 回溯引用条件 91
10.2.2 前后查找条件 94
10.3 小结 96
附录A 常见应用软件和编程语言中的正则表达式 97
A.1 grep 97
A.2 JavaScript 98
A.3 Macromedia ColdFusion 99
A.4 Macromedia Dreamweaver 100
A.5 Macromedia HomeSite(和ColdFusion Studio) 101
A.6 Microsoft ASP 101
A.7 Microsoft ASP.NET 102
A.8 Microsoft C# 102
A.9 Microsoft .NET 102
A.10 Microsoft Visual Studio .NET 103
A.11 MySQL 105
A.12 Perl 106
A.13 PHP 106
A.14 Sun Java 107
附录B 常见问题的正则表达式解决方案 110
B.1 北美电话号码 111
B.2 美国邮政编码 112
B.3 加拿大邮政编码 113
B.4 英国邮政编码 114
B.5 美国社会安全号码 115
B.6 IP地址 116
B.7 URL地址 117
B.8 完整的URL地址 118
B.9 电子邮件地址 119
B.10 HTML注释 120
B.11 JavaScript注释 121
B.12 信用卡号码 122
B.13 小结 127
附录C 正则表达式测试器 128
C.1 Regular Expression Tester软件 128
C.1.1 进行查找操作 129
C.1.2 进行替换操作 129
C.2 获得这套应用程序的一份副本 130
索引 131
展开
正则表达式(regular expression)和正则表达式语言已经出现很多年了。正则表达式的专家们早就掌握了这种威力无比强大的武器,它可以用来完成各种复杂的文本处理工作。更重要的是,这种武器可以在几乎所有的程序设计语言里和几乎所有的计算机平台上使用。
这是个好消息,但我还要告诉你一个坏消息:长期以来,只有一些真正的专家才能真正掌握正则表达式。甚至有很多人根本没有听说过正则表达式这个概念,更不用说用它们来解决问题了。至于少数勇于涉猎正则表达式领域的人们,又往往会因为正则表达式难以理解而浅尝辄止或总是在原地徘徊。这不能不说是一种悲哀,因为正则表达式其实并没有人们想像中的那么复杂。只要你能清晰地理解你想要解决的问题并学会如何使用正则表达式,就可以轻而易举地解决这些问题。
正则表达式不为大多数人所掌握的原因之一是关于这方面的好资料太少了。虽然有很多网站在吹嘘它们的正则表达式教程如何全面,但实际情况却是高质量的正则表达式学习资源相当稀缺。即便能够找到几本介绍正则表达式的书籍,它们又往往过于偏重语法而显得不够实用——知道如何定义{或是知道+与*之间的区别并不等于真正掌握了正则表达式的用法。在笔者看来,那些书籍反而把简单的问题弄得更复杂了:在学习和使用正则表达式的时候,重要的并不是你知道多少个特殊字符,而是你会不会运用它们去解决实际问题。
你拿在手里的这本书并不打算成为一本正则表达式的大全。如果你想要的是那样一本书,你应该去阅读Jeffrey Friedl编写的Mastering Regular Expressions(O’Reilly出版公司,ISBN 0596002890)。Friedl先生是业内公认的正则表达式专家,他的书绝对是这方面最权威和全面的著作。本人对Friedl先生没有丝毫成见,但他的书不适合初学者也是实情;如果你只打算尽快完成手头的工作而不是要钻研正则表达式的内部原理的话,他的书也不很适用。这并不是说那本书里的信息没有用,只是它在你想要给HTML表单添加一些验证功能或者只想对解析的文本进行替换的时候派不上什么用场。如果你想尽快学会正则表达式的基本用法,你将发现自己陷入了一个两难境地:要么找不到简明易学的参考资料,要么找到的参考资料过于深奥而让你不知该如何起步。
这正是促使笔者编写本书的原因。本书所讲授的关于正则表达式知识正是你们在刚起步时最需要的,我们将从简单的文本匹配开始循序渐进地向大家介绍许多复杂的专题,其中包括回溯引用(backreference,或译为后向引用)、条件性求值(conditional evaluation)和前后查找(looking- around),等等。本书最大的优势是所学到的知识可以立即运用于实践中:我们在每章里都为大家准备了许多简明又实用的示例,它们可以帮助你全面、系统、快速地掌握正则表达式并运用它们去解决实际问题,而每章在10分钟甚至更短的时间里就可以学完。
还等什么,赶快翻到第1章开始今天的学习吧,你肯定会立刻感受到正则表达式的强大威力。
目标读者
本书的目标读者是以下几类人员:
□第一次接触正则表达式。
□希望自己能够快速掌握正则表达式的基本用法。
□想使用一种强大的工具(虽然它不那么容易掌握)去解决实际问题。
□正在开发Web应用软件并需要进行复杂的表单和文本处理。
□正使用着Perl、ASP、Visual Basic、.NET、C#、Java、JSP、PHP、ColdFusion语言(或更多其他程序设计语言),希望在开发的应用程序里使用正则表达式。
□希望在不求助于其他人的前提下尽快掌握正则表达式。
致谢
首先,我要感谢正则表达式专家和我以前的合作者Michael Dinowitz,他对本书的技术细节进行了严格的审校并提供了许多宝贵的意见和反馈。
本书的附录C向大家介绍了一种基于Web的正则表达式测试器,而我必须在此感谢这个测试器的原始作者Nate Weiss(它最初是为ColdFusion Web Application Construction Kit一书而编写的)。在Nate的许可和支持下,我对他用ColdFusion编写的正则表达式测试软件进行了改写以配合本书使用,开发了相应的JavaScript版本。感谢Qasim Rasheed为这个测试器编写ASP和JSP版本,感谢Scott Van Vliet为这个测试器编写ASP.NET版本。
最后,我还要感谢Sams出版公司里帮助我把本书从概念变成现实的人们,尤其是Michael Stephens和Mark Renfrow。没有他们的帮助和支持,本书是不可能与大家见面的。
谢谢大家。
——Ben Forta