非淡泊无以明志,非宁静无以致远
全部博文(408)
分类:
2009-11-25 22:32:22
1.量词:
至于量词,我们会在它们自己的节里详细描述。量词表示前导的原子(也就是说,单字符或者分组)应该匹配的次数。它们列在中。
表 5.5. 正则量词
量词 |
原子性 |
含义 |
* |
否 |
匹配 0 或者更多次数(最大)。 |
+ |
否 |
匹配 或者更多次数(最大)。 |
? |
否 |
匹配 1 或者0次(最大)。 |
{COUNT} |
否 |
匹配COUNT 次 |
{MIN,} |
否 |
匹配至少MIN次(最大)。 |
{MIN,MAX} |
否 |
匹配至少MIN次但不超过MAX次(最大) |
*? |
否 |
匹配0或者更多次(最小) |
+? |
否 |
匹配1或者更多次(最小) |
?? |
否 |
匹配0或者1次(最小) |
{MIN,}? |
否 |
匹配最多MIN次(最小) |
{MIN,MAX}? |
否 |
匹配至少MIN次但不超过MAX次(最小) |
最小量词会试图匹配在它的许可范围内的尽可能少的次数。最大量词会试图匹配在它的许可范围内的尽可能多的次数。比如, .+ 保证至少匹配字串的一个字符,但是如果有机会,它会匹配所有机会。这里的机会将在稍后的小引擎的/能与不能/节里讲。
2.扩展的正则序列
我们想给新类型的元符号一个可以扩展的语法。因为我们只需要使用十二个元字符,所以我们选用原先被认为是非法正则的序列做任意语法扩展。这些元符号的形式都是 (?KEY...);也就是,一个开圆括弧后面跟着一个问号,然后是 KEY 和模式其余部分。KEY 字符表明它是哪种正则扩展。参阅看看正则扩展的一个列表。它们中大多数性质象列表,因为它们基于圆括弧,不过它们还是有附加含义。同样,只有原子可以量化,因为它们代表真正存在(潜在地)的东西。
扩展的正则序列
扩展 |
原子性 |
含义 |
(?#...) |
否 |
注释,抛弃 |
(?:...) |
是 |
只集群,不捕获的圆括弧 |
(?imsx-imsx) |
否 |
打开/关闭模式修饰词 |
(?imsx-imsx:...) |
是 |
集群圆括弧加修饰词 |
(?=...) |
否 |
如果前向查找断言成功,返回真 |
(?!...) |
否 |
如果前向查找断言失败,返回真 |
(?<=...) |
否 |
如果前向查找断言成功,返回真 |
(? |
否 |
如果前向查找断言失败,返回真 |
(?>...) |
是 |
匹配未反向跟踪的子模式 |
(?{...}) |
否 |
执行嵌入的Perl代码 |
(??{...}) |
是 |
匹配来自嵌入Perl代码 |
(?(...)...|...) |
是 |
匹配if-then-elase模式 |
(?(...)...) |
是 |
匹配if-then模式 |
最后,显示了所有你常用的字母数字元符号。(那些在变量代换回合处理过的符号在原子性列里用一个划线标记,因为引擎永远不会看到它们。)
字母数字正则元符号
扩展 |
原子性 |
含义 |
\0 |
是 |
匹配空字符(ASCII NUL) |
\NNN |
是 |
匹配给出八进制的字符,最大值为\377 |
\n |
是 |
匹配前面第n个捕获字串(十进制) |
\a |
是 |
匹配警钟字符(BEL) |
\A |
否 |
如果在字串的开头为真 |
\b |
是 |
匹配退格字符(BS) |
\b |
否 |
在字边界为真 |
\B |
否 |
不在字边界时为真 |
\cX |
是 |
匹配控制字符 Control-x(\cZ,\c[,等) |
\C |
是 |
匹配一个字节(C字符),甚至在utf8中也如此(危险) |
\d |
是 |
匹配任何数字字符 |
\D |
是 |
匹配任何非数字字符 |
\e |
是 |
匹配逃逸字符(ASCII ESC,不是反斜杠) |
\E |
-- |
结束大小写(\L,\U)或者掩码(\Q)转换 |
\f |
是 |
匹配进页字符(FF) |
\G |
否 |
如果在前一个m//g的匹配结尾位置时为真 |
\l |
-- |
只把下一个字符变成小写 |
\L |
-- |
把\E以前的字母都变成小写 |
\n |
是 |
匹配换行符字符(通常是NL,但是在Mac上是CR) |
\N{NAME} |
是 |
匹配命名字符(\N{greek:Sigma}) |
\p{PROP} |
是 |
匹配任何有命名属性的字符 |
\P{PROP} |
是 |
匹配任何没有命名属性的字符 |
\Q |
-- |
引起(消元)直到\E前面的字符 |
\r |
是 |
匹配返回字符(通常是CR,但是在Mac上是NL) |
\s |
是 |
匹配任何空白字符 |
\S |
是 |
匹配任何非空白字符 |
\t |
是 |
匹配水平制表符(HT) |
\u |
-- |
只把下一个字符变成标题首字符 |
\U |
-- |
大写(不是标题首字符)\E 以前的字符 |
\w |
是 |
匹配任何“字”字符(字母数字加"_" ) |
\W |
是 |
匹配任何“非字”字符 |
\x{abcd} |
是 |
匹配在十六进制中给出的字符 |
\X |
是 |
匹配Unicode里的”组合字符序列“字串 |
\z |
否 |
只有在字串结尾时为真 |
\Z |
否 |
在字串结尾或者在可选的换行符之前为真 |
如果在 \p 和 \P 里的属性名字是一个字符,那么花括弧是可选的。如果 \x 里的十六进制数为两位或者更少,那么花括弧也是可选的。在 \N 里的花括弧决不能省略。
只有在含义中带“匹配。。。”或者“匹配任何。。。”字样的元符号才能够在字符表(方括弧)里面使用。也就是说,字符表仅限于包含特定的字符集,因此在字符表里面,你只能使用那些描述特定字符集元符号,或者那些描述特定独立字符的元符号。当然,这些元符号也可以和其他非分类元符号一起在字符表外面用,不过,这里请注意 =b 是两只完全不同的怪兽:它在字符表内是退格字符,而在外边是一个字边界断言。
一个模式可以匹配的字符的数量和一个双引号字串可以替换的字符的数量有一些重叠。因为正则要经历两个回合,所以有时候应该由哪个回合处理一个给定的字符会显得有些混乱。如果出现混乱,这种字符的变量代换回合就推迟给正则表达式分析器。
请注意大小写和元引号包围转换逃逸(\U 和它的伙伴)必须在变量代换回合处理,因为这些元符号的用途就是影响变量代换。如果你用单引号禁止变量代换,那么你也不能获得转换逃逸。在任何单引号字串里,都不会进行变量或者转换逃逸(\U等)的扩展,在单号包围的的 m'...' 或者 qr'...' 操作符里也不会。甚至在你做代换的时候,如果这些转换逃逸是一个变量代换的结果,那么它们也会被忽略,因为这个时候他们想要影响变量代换已经太晚了。
尽管字符替换操作符不处理正则表达式,但是我们讨论过的任何匹配单个特定字符的元符号在 tr/// 操作中仍然可用。而其他的用不了(除了反斜杠以外,它继续按照它原来的样子运转)。