2007年5月28日星期一

《Learning Perl》学习笔记 -- 第八章 正则表达式提高

本章介绍了字符类、通用数量符、锚位符、记忆的小括号、反向引用及优先级等重要内容,前面的内容好懂、易记,后面的“记忆的小括号、反向引用和优先级”的内容需要重点理解与掌握,有一定难度。

1.字符类

字符类(character class),即在一对中括号([])中列出的所有字符,可以匹配类中的任何单个字符,它只匹配一个字符,但该字符必须在表中。譬如[abcdwxyz]或[a-dw-z](可用短横-指定一个字符范围,上面两个字符类是等价的)。

可以用双引号字符串中类似的字符快捷方式来定义一个字符类,譬如[000-177]匹配任何7比特ASCII字符。

在字符类前加一个脱字符(^)可以反置它,即只匹配不包含在中括号中的任何单个字符。譬如[^abc]匹配除了a、b和c之外的任何字符。注意,脱字符必须出现在中括号内字符的最前面,否则不具备反置的含义。如[a^bc]表示匹配a、^、b和c中的任一字符。

字符类的快捷方式:

d:匹配所有数字的字符类,等价于[0-9];d是digital的缩写

w:匹配所谓的“单词”字符,即普通字母、数字和下划线,等价于[A-Za-z0-9_];w是word的缩写

s:匹配空白,包括换页符、制表符、换行符、回车符和空个字符,等价于[ftnr ];s是space的缩写

D:匹配所有非数字字符类,即d的反置形式,等价于[^d];

W:匹配所有的非“单词”字符,即w的反置形式,等价于[^w];

S:匹配所有的非空白字符,即s的反置形式,等价于[^s];

2.通用数量符

使用大括号({})中的一对由逗号隔开的数字来指定重复的最少和最多次数。

/a{N,M}/:匹配重复N到M次的字符a;

/a{N,}/:匹配重复次数大于等于N的字符a,没有上限;

/a{N}/:匹配重复次数等于N的字符a,精确匹配;

3.锚位符(anchor)

^:标志字符串的头,可以理解为标志行首,譬如/^fred/匹配以fred开头的行;

$:标志字符串的尾,可以理解为标志行尾,譬如/fred$/匹配以fred结束的行;

b:单词边界锚位符,标志单词的开始与结束,用于精确匹配单词(单词中只含有w类型的字符),譬如/bfredb/精确匹配单词fred;

B:非单词边界锚位符,可以看作b的反置形式;

4.记忆的小括号及反向引用

小括号的一个功能是把模式的一些部分组合起来,它的第二个作用是要求正则表达式引擎记住与小括号中的模式匹配的那部分子串。也就是说,它不是记住模式本身,而要记住相应的部分字符串。在用小括号进行分组时,它们自动具有记忆功能。

反向引用(backreference)就是回头引用当前模式处理过程中保存的记忆。反向引用由一个反斜杠来构成,譬如,1包含第一个正则表达式记忆(即被第一对小括号匹配的字符串部分)。

反向引用被用来匹配与模式在前面匹配的字符串完全一样的字符串,譬如/(.)1/匹配任何字符,后跟同一个字符,即匹配任何双字符(如aa,11,两个连续空格等)。

反向引用使用n来标记第n个正则表达式记忆,确定n的方法是:从左到右,只数左括号的个数即可。譬如,在模式/((fredwilma)(stone))/中,1表示最外层的小括号匹配的字符串部分,2表示(fredwilma)小括号匹配的字符串,3表示(stone)小括号匹配的字符串。

在使用八进制转义字符时,如果小于100,则最高位写0,如012,以避免被误当作反向引用。

5.优先级

在介绍优先级之前,需要了解所谓的原子(atom),它是构成模式最基本的片段,可以看作不可分割的一个最小单元。原子包括独立的字符、字符类和反向引用。

正则表达式的优先级分四个级别,优先级数字越低,级别越高:

1.小括号,用作分组和记忆。小括号中的任何东西比其它东西都更紧密地“粘在一起”;

2.数量符,包括星号(*)、加号(+)、问号(?)和大括号构成的数量符;

3.锚位符和字符串序列,即一个单词中的字母粘在一起的紧密程度与锚位符粘着字母的紧密程度一样;

4.最低的优先级是表示选择的竖线。

没有评论: