非淡泊无以明志,非宁静无以致远
全部博文(408)
分类:
2009-11-26 22:55:41
1.特定的字符:
如前所述,非特殊的东西在模式里匹配自身。这意味着一个 /a/ 匹配一个 "a",一个 /=/ 匹配一个 "=" 等等。不过,有些字符可不是那么容易在键盘上敲进去,或者即使你敲进去了,也不会在打印输出中显示出来;最臭名昭著的例子就是控制字符。在正则表达式里,Perl 识别下列双引号包围的字符别名:
逃逸 |
含义 |
\0 |
空字符(ASCII NUL) |
\a |
警铃(BEL) |
\e |
逃逸(ESC) |
\f |
进纸(FF) |
\n |
换行符 (NL,Mac里的CR) |
\r |
回车(CR,Mac里的NL) |
\t |
水平制表符(HT) |
就象在双引号包围字串里一样,Perl 还识别模式里的下面四种元符号:
\cX
一个命名的控制字符,象 \cC 指 Control-C,\cZ 指 Control-Z,\c[ 指 ESC,而 \c? 表示 DEL。
\NNN
用两位或者三位八进制码声明的字符。除了小于 010 的数值(十进制 8)外,前导的 0 是可选的,因为(和在双引起字串里不同)一位数字的东西总认为是用于在模式里捕获字串的引用。如果你在模式里先捕获了至少 n 个子字串,那多位数字解释成第 n 个引用(这里 n 被认为是一个十进制数)。否则,他们被解释成一个用八进制声明的字符。
\x{LONGHEX}
一个用一到两个十六进制数位([0-9a-fA-F])声明的字符,比如 \x1B。一位数字的形式只有在后面跟随的字符不是一个十六进制数字才可用。如果使用了花括弧,你想用多少位数字都可以,这时候结果可能是一个 Unicode 字符。比如,\x{262} 匹配一个 Unicode YIN YANG。
\N{NAME}
一个命名字符,如 \N{GREEK SMALL LETTER EPSILON},\N{Greek:epsilon},或者\N{epsilon}。它要求使用第三十一章,用法模块,里描述的 use charnames 用法,它同时还判断你可能使用那些名字中的哪一个(分别是 ":long",":full",":short",对应上面三个风格。)
你可以在离你最近的 Unicode 标准文档里找到所有 Unicode 字符名字的列表,或者在 PATH_TO_PERLLIB/unicode/Names.txt 里也有。
2.通配元字符:
三个特殊的元符号可以用做通用通配符,它们的每一个都可以匹配"任何"字符(是"任何"中的某些字符)。它们是句点("."),\c 和 \x。它们都不能在字符表里使用。你不能在字符表里用句点是因为它会匹配(几乎)任何存在的字符,因此它本身就是某种万能字符。如果你想包括或者排除所有东西,也没有什么必要使用一个字符表。特殊通配符 \C 和 \X 有着特殊的结构化含义,而这些特殊含义和选择单个 Unicode 字符的表示法关联得并不好,而该表示法才是字符表运行的层次。
句点元字符匹配除了换行符以外的任何单字符。 (如果带着 /s 修饰词,也能匹配换行符)和十二个特殊字符里的其它字符一样,如果你想匹配一个文本句点,你就必须用一个反斜扛逃逸它。比如,下面的代码检查一个文件名是否以一个句点后面跟着一个单字符扩展名结尾的:
if ($pathname =~ /\.(.)\z/s) {
print "Ends in $1\n";
}
第一个句点是逃逸了的,是文本句点,而第二个句点说"匹配任何字符"。\z 说只匹配字串末尾的东西,而 \s 修饰词令点也可以匹配换行符。(的确,用换行符做文件扩展名不怎么漂亮,但并不是说就不能做。)
点元字符经常和量词一起使用。.* 匹配尽可能多的字符,而 .*? 匹配尽可能少的字符。不过有时候它不用量词而是自己解决长度问题: /(..):(..):(..)/ 匹配三个用冒号分隔的域,每个域两个字符长。
元符号 \X 在更广的概念上匹配字符。它实际上是匹配一个由一个或多个 Unicode 字符组成的字串,这个字串就是所谓的"组合字符序列"。这样的序列包括一个基本字符和后面跟着任意个"标志"字符(象变音符和分音符那样的区分标志)一起组成一个逻辑单元。\X 实际上等效于 (?:\PM\pM*)。这样做允许匹配一个逻辑字符,即使这几个字符实际上是由几个独立的字符组成的也行。如果匹配任意组合字符,那么在 /\X/ 里匹配的长度将超过一个字符长。(而且这里的字符长度和字节长度没有什么关系)。
如果你在使用 Unicode 并且真的想获取单字节而不是单字符,那么你可以使用 \C 元字符。它将总是匹配一个字节(具体说,就是一个 C 语言的 char 类型),而不管是否会与你的 Unicode 字符流步调失调。