全部博文(48)
分类: Python/Ruby
2012-03-08 15:47:13
字符分类:
简单的模式
1. 正则表达式,在Perl 中通常被称为模式(pattern), 要匹配某个模式(正则表达式),可以将模式放在正斜线(//)之间
2. 正则表达式(regular expressions)是一种特殊语言写成的程序,内嵌于Perl 之中。
3. 我们将正则表达式看作一种由简单语言实现的程序,这种语言只有一个任务:查找某个字符串,返回“匹配上(it matches)”或者“不匹配(it doesnot match)”,这就是它完成的所有工作。
4. 所有在双引号中的转义字符在模式中均有效,因此你可以使用/coke\tsprite/来匹配11 个字符的字符串coke, tab(制表符),sprite。
5. 元字符前使用反斜线将使它变成普通的字符。如,模式/3\.14159/中的点(.)即不是通配符。这条规则对Perl 正则表达式中所有元字符均有效。
6. 点(.)是通配符,它可以匹配任何单个的字符,但不包括换行符(“\n”)
7. 数量词(* + ?)必须紧跟在某些项的后面,因为它是指前面项重复的次数。
l 星号(*)表示匹配前一项0次或者多次
.*叫做“任意字符串匹配模式”,因为任意的字符串均能被匹配上(不包括换行符)
l 加(+)的意思是可以匹配前面一项的一个或多个
l 问号(?),其含义是前面一个项出现一次,或者不出现
空格不是元字符 /fred +barney/意思是fred 和barney 之间由空格分开,且只能是空格
8. 模式中的分组
括号也是元字符,模式/(fred)+/能匹配上像fredfredfred 这样的字符串
9. 选择符竖线(|),
/fred( |\t)+barney/这样的模式,它将匹配fred,barney 以及中间由空格,制表符(tab),或者二者混合所组成的字符串。
如果希望fred 和barney 之间的字符是一样的,可以将模式写成/fred( +|\t+)barney/。在本例中,分隔符必须全是空格或者全是制表符。
单词and 和or 在正则表达式中不是操作符!它们在正则表达式中就是其本来的含义:单词and,or。
字符类
字符类,是方括号[]中的一列字符,可以匹配上括号内出现的任意单个字符。
1. 有时,指出没有被字符类包含的字符更加容易。字符类前使用符号^将取此字符类的补集。也就是说,[^def]]将匹配上这三个字符中之外的任意单个字符
2. 使用连字号(-)来表示某个范围的字母:
[^n\-z]将匹配上n, -, z 之外的任何字符。(连接符(-)前面使用反斜线的原因是,它在此字符类中有特别的含义(表示字符的范围)
但/HAL-[0-9]+/中第一个连接符(-)前不需要反斜线,因为此时的连接符不会被理解为有特殊的含义。)
3. 字符类的简写
l \d 任何数字的类,[0-9]
l \w 被称作“word’字符:[A-Za-z0-9_] 请记住我们对“word”的定义,字母,数字,下划线组成
\w 不能匹配单词,而只能匹配单个字符。为了匹配整个单词,需要后接加号
/fred \w+ barney/
l \s 对于匹配空白(whitespace)将非常方便。它等价于[\f\t\n\r ],其含5 个空白字符:格式符(form-feed);制表符(tab),换行符,回车,以及空格符。
同其它简写符号一样,\s 匹配此类中的单个字符,如果使用\s*将匹配任何个数的空白(包括没有),或者\s+匹配一个以上的空白(事 实上,很少见到单独使用\s,而不使用任何的数量词(*, +))
4. 简写形式的补集
l 某些时候,你可能希望得到这三种简写形式的补集。如果那样的话,你可以使用[^\d], [^\w], 和[^\s],其含义分别是,非数字的字符,非word(记住我们对word 的定义)的字符,和非空白的字符。也可以使用它们对应的大写形式:\D, \W, \S 来完成。它们将匹配它们对应的小写形式不能匹配上的字符。
l 这些简写形式可以在字符类中使用,或者在大的字符类中的中括号里面使用。
也就是说你可以使用/[\dA-Fa-f]+/来匹配十六进制(底为16)的数字
另一个类字符[\d\D],它的意思是任何数字,和任何非数字,则意指任何字符。这是匹配所有字符的一种通用方法,甚至包括换行符,而点(.)匹配除换行符以外的任何字符。而[^\d\D]则完全没用,因为它匹配既非数字也非非数字的字符,那什么也不是。
字符类中只有连接符-是特殊字符?字符类[]中的?*+ .不是特殊字符?
/\./ 等价 /[.]/