日期:2013-09-01  浏览次数:21108 次

目录

  1. 本文目标
  2. 如何使用本教程
  3. 正则表达式到底是什么?
  4. 入门
  5. 测试正则表达式
  6. 元字符
  7. 字符本义
  8. 反复
  9. 字符类
  10. 反义
  11. 替换
  12. 分组
  13. 后向援用
  14. 零宽断言
  15. 负向零宽断言
  16. 注释
  17. 贪婪与懒惰
  18. 处理选项
  19. 平衡组/递归婚配
  20. 还有些什么东西没提到
  21. 联系作者
  22. 最后,来点广告...
  23. 一些我认为你可能曾经知道的术语的参考
  24. 网上的资源及本文参考文献
  25. 更新说明

本文目标

30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在本人的程序或网页里使用它。

如何使用本教程

最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30内入门。当然,如果你是超人,那自然得另当别论。

别被下面那些复杂的表达式吓倒,只需跟着我一步一步来,你会发现正则表达式其实并没有你想像中的那么困难。当然,如果你看完了这篇教程之后,发现本人明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理,当前你还需求多练习,多使用,才能熟练掌握正则表达式。

除了作为入门教程之外,本文还试图成为可以在日常任务中使用的正则表达式语法参考手册。就作者本人的经历来说,这个目标还是完成得不错的——你看,我本人也没能把所有的东西记下来,不是吗?

文本格式商定:专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 用于在其中搜索的字符串 对正则表达式或其中一部分的说明清除格式

正则表达式到底是什么?

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需求。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本婚配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。

正则表达式是用于进行文本婚配的工具,所以本文里多次提到了在字符串里搜索/查找,这种说法的意思是在给定的字符串中,寻觅与给定的正则表达式相婚配的部分。有可能字符串里有不止一个部分满足给定的正则表达式,这时每一个这样的部分被称为一个婚配。婚配在本文里可能会有三种意思:一种是描述词性的,比如说一个字符串婚配一个表达式;一种是动词性的,比如说在字符串里婚配正则表达式;还有一种是名词性的,就是刚刚说到的“字符串中满足给定的正则表达式的一部分”。

入门

学习正则表达式的最好方法是从例子开始,理解例子之后再本人对例子进行修正,实验。下面给出了不少简单的例子,并对它们作了详细的说明。

假设你在一篇英文小说里查找hi,你可以使用正则表达式hi。

这是最简单的正则表达式了,它可以精确婚配这样的字符串:由两个字符组成,前一个字符是h,后一个是i。通常,处理正则表达式的工具会提供一个忽略大小写的选项,如果选中了这个选项,它可以婚配hi,HI,Hi,hI这四种情况中的任意一种。

不幸的是,很多单词里包含hi这两个连续的字符,比如him,history,high等等。用hi来查找的话,这里边的hi也会被找出来。如果要精确地查找hi这个单词的话,我们应该使用\bhi\b。

\b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处。虽然通常英文的单词是由空格或标点符号或换行来分隔的,但是\b并不婚配这些单词分隔符中的任何一个,它只婚配一个位置。(如果需求更精确的说法,\b婚配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)\w)

假如你要找的是hi后面不远处跟着一个Lucy,你应该用\bhi\b.*\bLucy\b。

这里,.是另一个元字符,婚配除了换行符以外的任意字符。*同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续反复出现任意次以使整个表达式得到婚配。因此,.*连在一同就意味着任意数量的不包含换行的字符。如今\bhi\b.*\bLucy\b的意思就很明显了:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词。

如果同时使用其它的一些元字符,我们就能结构出功用更强大的正则表达式。比如下面这个例子:

0\d\d-\d\d\d\d\d\d\d\d婚配这样的字符串:以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字(也就是中国的电话号码。当然,这个例子只能婚配区号为3位的情形)。

这里的\d是一个新的元字符,婚配任意的数字(0,或1,或2,或……)。-不是元字符,只婚配它本身——连字号。

为了避免那么多烦人的反复,我们也可以这样写这个表达式:0\d{2}-\d{8}。 这里\d后面的{2}({8})的意思是前面\d必须连续反复婚配2次(8次)。

测试正则表达式

如果你不觉得正则表达式很难读写的话,要么你是一个天才,要么,你不是地球人。正则表达式的语法很令人头疼,即便对经常使用它的人来说也是如此。由于难于读写,容易出错,所以很有必要创建一种工具来测试正则表达式。

由于在不同的环境下正则表达式的一些细节是不相反的,本教程引见的是Microsoft .Net 2.0下正则表达式的行为,所以,我向你引见一个.Net下的工具Regex Tester。首先你确保曾经安装了