正则表达式详解

空闲下来决定好好研究下正则表达式,看了传说中正则表达式书中被誉为圣经级的书《精通正则表达式第三版》,以下作为我的记录稿

1.正则表达式基础:

完整的正则表达式由两种字符构成:特殊字符(元字符)和普通文本字符(文字);

(1)首先是脱字符^与美元符$:在检查一行代码时,^表示行的开始,$表示行的结束;正则表达式cat查询就是普通文本,只要包含cat都在范围内,但^cat则不同,表示

查找行首的cat,cat$表示只查找行尾的cat,^cat$表示一行中只有cat的行;

匹配分别如下:

(2)字符组:[.....],匹配列举的字符之一;例如[sS]hen[Ll]iang匹配的是shenliang,shenLiang,Shenliang,ShenLiang;在字符组内部可以使用连字符‘—’表示一个范围

如[123456789abcdfABCDEF]与[1-9a-fA-F]是一样的;但这里要注意只有在字符组中并且不是紧跟[时连字符才是元字符,否则只是一个普通的连字符号;而于此相反的

问号,点号等在字符组中只表示普通文本;还有(1)中讲到的脱字符^如果在字符组内部并且紧跟[时表示排除型字符组

(3). 号用来匹配任意的字符(前提在字符组外),例如:匹配2012/07/02,2012.07.02和2012-07-02可以使用2012[-./]07[-./]02(这里-必须紧跟[)或者2012.07.02

(4)| 表示或 如 bob|rob表示能同时匹配任意一个字符串的正则表达式,称为多选结构

因此我们看到下面三种表达是同意的:

b[oa]g   b(o|a)g   bog|bag  但b[o|a]g就不是,因为在字符组中|是普通字符不是元字符

这里要注意字符组与多选结构的区别,虽然从上面的表达式看是差不多,但字符组只能匹配一个字符而多选结构可以匹配任意多个字符

综合:^(Form|Subject|Date):*匹配以’Form:*’,’ Subject:*’,’ Date:*’开头的文本行,在提取email信息的文本中还是很有用的

在正则表达式前加 -i可以让匹配忽略大小写

单词分界符:\< \> 来匹配一个单词,例如\<cat\> 即匹配cat这个单词,但这个并不是所有的正则都支持的

注意:a.在字符组内部,与元字符的定义规则(和意义)是不一样的。例如,在字符组外部,点号是元字符,但是在内部则不是如此。相反,连字符只在字符内部才是元字符,否则就不是。脱字符在字符组外部表示匹配行开头,在字符组内部紧接着[并后跟字符时表示匹配除该字符以外的字符,其他情况下又有别意思。

b.明白字符组[abc]与多选项[a|b|c]的区别,虽然给的例子是同一个意思,但不代表所有,字符组无论给出的字符有多少,匹配时都只能匹配一个字符,而多选项可以匹配

任意长度的文本,每个多选项可能匹配的文本都是独立的(不过多选项没有像字符组那样具有排除功能^)。

c.排除字符数组是表示所有未列出字符的字符组的简便方法。主要注意一个问题就是[^x]的意思不是“当这个位置不是x时才能匹配”,而是说“匹配一个不等于x的字符”,

例如ca[^t]可以匹配caa等但不能匹配ca

表格总结下:

(5)? 代表可选项:把它加在一个字符的后面表示此处容许出现这个字符但当然也可以不包括这个字符,例如liang?可以匹lian与liang;再来个复杂点的例子:

7月4日(july fourth),但july可以写成jul与july,fourth可以写成fourth,4th或4,用前面的方式可以写出匹配的正则表达式为(july|jul).(fourth|4th|4)

现在使用可选项可以改为july?.(fourth|4(th)?)   与问号类似的还有*和+,+表示紧邻的字符出现一次或多次,但必须出现一次,而*表示紧邻的字符出现一次

或多次也可以不出现,这个三个元字符统称为量词;例子:匹配html中的字体大小<H[1-6]>,但由于html没有严格的规定,因此标签中可能出现任意多的空格

那我们现在就能来处理,如<H[1-6].*> 表示可以有任意多个.来匹配空格

(6)转义字符反斜杠\:在元字符前加上\进行转义,适用于所有的元字符,例如:www.baidu.com 可以使用www\.baidu\.com进行匹配

明天更新

 

 

posted on 2012-07-03 01:17  发表是最好的记忆  阅读(710)  评论(0编辑  收藏  举报