正则表达式和模式匹配简介——字符表示
作者:张桂权
(摘自《 正则表达式袖珍手册》一书。译者,张桂权。可以从http://download.csdn.net/source/346896下载完整的译稿。如果感觉不错就去买一本原版的书吧,Regular Expression Pocket Reference,支持原书的作者。看PDF文件也是很累的。看完之后别忘了,给我提宝贵意见哦。谢谢。ajax.mailer@gmail.com)
很多实现提供了难输入字符的快捷表达字符。(请参看MRE115-118)
字符速记
很多正则表达式实现为alert(告警), backspace(空白), escape character(换码符), form feed(换页符), newline(换行),carriage return(回车), horizontal tab(水平制表符)和vertical tab characters(垂直制表符)指定了速记字符。例如,/n是换行符的速记,通常是LF(012,八进制),但是有时可能是CR(015,八进制),依赖于操作系统。比较混乱的是,很多实现中同时用/b表示空格和字边界(“字”字符和非字字符之间的位置)。对于这些实现来说,在字符类(字符串匹配中可能的字符的集合)中表示空格,其余地方表示字边界。
八进制转义:/num
用两个或三个八进制数字表示一个字符。比如/015/0112匹配ASCII中的CR/LF字符序列。
十六进制和Unicode转义:/xnum, /x{num}, /unum, /Unum
用十六进制数表示字符。四位数字和更大的数可以表示Unicode字符范围。比如,/x0D/x
控制字符:/cchar
由于ASCII控制字符用小于32的数值编码。为了安全,通常用一个大写的char——有些实现不处理小写表示。例如,/cH匹配Control-H,一个ASCII控制字符。
字符类和类似(class-like)的结构
字符类用来指定自己的集合。一个字符类匹配输入字符串的中字符集定义中的单一字符。(请参看MRE 118-128)
普通类:[…]和[^...]
字符类,[…],和求反字符类[^…],允许你列出你想或不想匹配的字符。一个字符类通常匹配一个字符。-(破折号)描述字符的范围。例如,[a-z]匹配ASCII中任意一个小写字符。把破折号包括在字符列中,要么首先列出它,要么回避它。
任意字符:dot(.),点号
通常匹配换行之外的任意字符。但是匹配的模式可以改变,所以点号也可以匹配换行。在字符集内,点号就是一个点号罢了。
类速记:/w,/d,/s,/W,/D,/S
通常提供字字符,数字和空格字符类的速记。一个字字符通常包括ASCII字母数字和下划线(underscore)。不过,依据不同的实现,字母数字表可以包括添加地区或Unicode字母数字。小写速记(比如,/s)匹配类中的一个字符。大写速记(比如,/S)匹配不在类中的一个字符。例如,/d匹配一个数字字符,通常等效于[0-9]。
POSIX字符类:[:alnum:]
POSIX定义了一些只能在正则表达式中使用的字符类(参照表1)。比如[:lower:]。当写作[[:lower:]]时等效于ASCII的[a-z]。
POSIX字符类 |
|
类名 |
类描述 |
Alnum |
字母和数字 |
Alpha |
字母 |
Blank |
仅表示空格或制表符 |
Cntrl |
控制字符 |
Digit |
十进制数 |
Graph |
打印字符,不包含空格 |
Lower |
小写字母 |
|
打印字符,包含空格 |
Punct |
打印字符,不包含字母和数字 |
Space |
空白 |
Upper |
大写字母 |
Xdigit |
十六进制数 |
表1 POSIX字符类
Unicode属性、字体和区位:/p{prop},/P{prop}
Unicode标准定义的字符类拥有特殊的属性,所属的字体和存在区位。属性是字符定义的特性,比如,是一个字母还是数字(参看表2)。字体就是书写系统,比如Hebrew、Latin或Han。区位就是字符在Unicode字符上的范围映射。有些字符要求在Unicode属性上加前缀Is或In。比如,/p{Ll}匹配支持Unicode编码的语言的小写字母,比如,a 或α 。
Unicode联合字符:/X
匹配Unicode字符,后续任意数量的Unicode联合字符。这是/P{M}/p{M}的速记。例如,/X匹配è或e',以及这两个字符。
标准Unicode属性 |
|
属性名 |
属性描述 |
/p{L} |
字母 |
/p{Ll} |
小写字母 |
/p{Lm} |
修饰字母 |
/p{Lo} |
字母和其他。不区分大小写,不是修饰字母 |
/p{Lt} |
标题字母(Ttitlecase) |
/p{Lu} |
大写字母 |
表2标准Unicode属性
标准Unicode属性(续) |
|
/p{Cc} |
ASCII 和 Latin-1控制字符 |
/p{C} |
不在其他类中的控制码和字符 |
/p{Cf} |
非可视格式化字符 |
/p{Cn} |
未指定的码点 |
/p{Co} |
私人使用,比如公司的Logo |
/p{Cs} |
替代 |
/p{M} |
连接基本字符的符号,比如重音符号 |
/p{Mc} |
在自己的空间内变化的字符,实例包括元音信号(vowel signs) |
/p{Me} |
靠近字符的符号,比如园、正方形、菱形 |
/p{Mn} |
改变其他字符的字符,比如重音(accents)和曲音(umlauts) |
/p{N} |
数字字符 |
/p{Nd} |
不同字体中的十进制数字 |
/p{Nl} |
表示数字的字母,比如随机数 |
/p{No} |
上标(unperscropts)、符号(symbol)或表示数的非数字字符 |
/p{P} |
标点(Punctuation) |
/p{Pc} |
连接标点,比如下划线 |
/p{Pe} |
破折号和连字符(hyphens) |
/p{Pi} |
起始标点,比如开引号 |
/p{Pf} |
结束标点,比如闭引号 |
/p{Po} |
其他的标点 |
/p{Ps} |
开标点,比如开括号 |
/p{S} |
符号 |
/p{Sc} |
货币符号 |
/p{Sk} |
组合字符,不如专用字符(individual characters) |
/p{Sm} |
数学符号 |
/p{So} |
其他符号 |
/p{Z} |
非可视化表示的分隔符 |
/p{Zl} |
行分隔符 |
/p{Zp} |
段分隔符 |
/p{Zs} |
空格符 |
锚和0宽断言
锚和“0宽断言”匹配输入字符串的位置。(请参看MRE128-134)
行或字符串的起始:^ ,/A
匹配被搜索字符串的起始位置。当在多行的情况下,^匹配后面的任意换行。有些实现支持/A,它仅匹配文本的起始位置。
行或字符串结尾:$,/Z,/z
$匹配字符串的结尾。在多行的情况下,$匹配前面的任意一个换行。当正则表达式的具体实现支持/Z时,无论是否是匹配模式,它匹配字符串的结尾或字符串结尾换行之前的位置。有些实现同样支持/z,仅用来匹配字符串的结尾,无论是不是换行。
匹配的起始位置:/G
在重叠匹配中,/G匹配前一个匹配结束的位置。通常,这个位置被设置为匹配失败的起始位置。
字边界:/b,/B,/<,/>
字边界元字符匹配一个字和紧挨的非字字符之间的位置。/b通常指定一个字的边界位置,而,/B指定非字符边界位置。有些实现提供/<和/>作为字起始和结束的分隔元序列。
向前:(?=...),(?!...)
向后:(?<=...),(?<!...)
向前的结构匹配文本中的一个位置,子模式可能在这里匹配(向前),可能不匹配(向后),或结束匹配(向后),或不可能结束匹配(向后)。例如,(?=bar)匹配foobar中的foo,但是不匹配food。在实现中通常限制子模式向后匹配的预定长度。