正则表达式和模式匹配简介(二)

时间:2022-03-15 16:50:19

正则表达式和模式匹配简介——字符表示

作者:张桂权

(摘自《

正则表达式袖珍手册》一书。译者,张桂权。可以从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是换行符的速记,通常是LF012,八进制),但是有时可能是CR015,八进制),依赖于操作系统。比较混乱的是,很多实现中同时用/b表示空格和字边界(“字”字符和非字字符之间的位置)。对于这些实现来说,在字符类(字符串匹配中可能的字符的集合)中表示空格,其余地方表示字边界。

 

八进制转义:/num

       用两个或三个八进制数字表示一个字符。比如/015/0112匹配ASCII中的CRLF字符序列。

 

十六进制和Unicode转义:/xnum, /x{num}, /unum, /Unum

       用十六进制数表示字符。四位数字和更大的数可以表示Unicode字符范围。比如,/x0D/x 0A 匹配ASCIICRLF字符序列。

 

控制字符:/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

小写字母

Print

打印字符,包含空格

Punct

打印字符,不包含字母和数字

Space

空白

Upper

大写字母

Xdigit

十六进制数

 

1 POSIX字符类

 

Unicode属性、字体和区位:/p{prop}/P{prop}

       Unicode标准定义的字符类拥有特殊的属性,所属的字体和存在区位。属性是字符定义的特性,比如,是一个字母还是数字(参看表2)。字体就是书写系统,比如HebrewLatinHan。区位就是字符在Unicode字符上的范围映射。有些字符要求在Unicode属性上加前缀IsIn。比如,/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。在实现中通常限制子模式向后匹配的预定长度。