2.3 字符转义-2.1 元字符 -正则表达式学习笔记 -grule
语法概览 2008-10-10 13:25:24 阅读3 评论0 字号:大中小
2.3 字符转义-2.1 元字符 -正则表达式学习笔记 -grule
正则表达式定义了一些特殊的元字符,如^、$、.等。由于这些字符在正则表达式中被解释成其他的指定的意义,如果需要匹配这些字符,则需要使用字符转义来解决这一个问题。转义字符为“/”(反斜杠),它可以取消这些字符(如^、$、.等)在表达式中的具有的特殊意义。以下正则表达式匹配字符“.”。
/. (30)
以下正则表达式匹配字符“*”。
/* (31)
以下正则表达式匹配字符“/”。
// (32)
以下正则表达式匹配字符串“www.myweburl.com”。
www/.myweburl/.com (33)
正则表达式的常用转义字符的说明如表2-3所示。其中,除了.、$、^、{、[、(、|、)、*、+、?、/之外的字符不需要进行转义,它们都表示字符本身。
表2-3常用字符转义
字符或表达式
|
说明
|
/a
|
响铃(警报)/u0007。
|
/b
|
在正则表达式中,表示单词的边界;如果在字符类中,则表示退格符/u0008。
|
/t
|
制表符符/u0009。
|
/r
|
回车符/u000D。
|
/v
|
垂直制表符/u000B。
|
/f
|
换页符/u000C。
|
/n
|
换行符/u000A。
|
/e
|
回退(Esc)符/u001B。
|
/040
|
将ASCII字符匹配为八进制数(最多三位)。
|
/x20
|
使用十六进制表示形式与ASCII字符匹配。
|
/cC
|
ASCII控制字符,如Ctrl-C。
|
/u0020
|
使用十六进制表示形式(恰好四位)与Unicode字符匹配。
|
注意:正则表达式中的元字符在字符类中不做任何特殊处理,它仅仅表示一个自身的字符。如正则表达式[-.]只能匹配字符“-”和“.”,它不能匹配除字符“-”和“.”之外的字符。因此,在字符类中使用元字符时,不需要使用转义操作。
在正则表达式中,常用的字符类如表2-2所示。
表2-2常用的字符类
字符或表达式
|
说明
|
.
|
匹配除换行符号之外的任意字符。
|
/w
|
匹配单词字符(包括字母、数字、下划线和汉字)。
|
/W
|
匹配任意的非单词字符(包括字母、数字、下划线和汉字)。
|
/s
|
匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等。
|
/S
|
匹配任意的非空白字符。
|
/d
|
匹配任意的数字。
|
/D
|
匹配任意的非数字字符。
|
[aeiou]
|
匹配字符集合中的任何字符。
|
[^aeiou]
|
匹配除字符集合中的之外的字符。
|
[0-9a-zA-Z_]
|
匹配任何数字、字母(大写字母和小写字母)和下划线,等同于/w
|
[^0-9a-zA-Z_]
|
匹配除任何数字、字母、下划线之外的任何字符,等同于/W。
|
/p{name}
|
匹配{name}指定的命名字符类中的任何字符。
|
/P{name}
|
匹配除{name}指定的命名字符类中之外的任何字符。
|
注意:在表2-2中,表达式/p{name}和/P{name}为.NET Framework所支持。
在正则表达式中,元字符通常一次只能匹配一个位置或字符集合中的一个字符。通常情况下,如果要匹配数字、字母、空白等字符时,可以直接使用与这些集合相对应的元字符。然而,如果要匹配的字符集合(如集合[0,1,2,3,4,5])没有与之相对应的元字符时,则需要自定义匹配的字符集合。此时,可以使用字符类解决这个一个问题。字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它就会找到该匹配项。
字符类是正则表达式中的“迷你”语言,可以在方括号“[]”中定义。最简单的字符类是方括号“[]”和一个字母表表构成,如元音字符类[aeiou]。以下正则表达式匹配数字0、1、2、3、4、5、6中的任何一个。
[0123456] (20)
以下正则表达式可以匹配任何数字(即0、1、2、3、4、5、6、7、8、9)。
[0123456789] (21)
以下正则表达式匹配HTML标记中的“<H1>”、“<H2>”、“<H3>”、“<H4>”、“<H5>”或“<H6>”。
<H[123456]> (22)
以下正则表达式匹配字符串“Jack”或者“jack”。
[Jj]ack (23)
然而,正则表达式[0123456789]的书写非常不方便。因此,正则表达式引入了连接符“-”定义字符的范围。以下正则表达式等价于正则表达式[0123456789]。
[0-9] (24)
以下正则表达式可以匹配任何小写字母。
[a-z] (25)
以下正则表达式可以匹配任何大写字母。
[A-Z] (26)
注意:当且仅当在字符类中的连接符“-”不是第一个字符时,它才具有特殊的含义:它可以指定字符类的最大边界和最小边界之间的任何字符。它的具体含义由具体的字符类决定。因此,字符类的最大边界和最小边界,以及字符在ASCII或Unicode表中出现的顺序共同确定了连接符“-”指定的字符的范围。
如果要在字符类中包括连接符“-”,则必须将它作为第一个字符。如正则表达式[-a]匹配字符“-”或者“a”。
在字符类中,若字符“^”是字符类的第一个字符,则表示否定该字符类,即匹配除了该字符类之外的任意字符。以下正则表达式可以匹配任何非元音字符。
[^aAeEiIoOuU] (27)
以下正则表达式可以匹配除连接符“-”之外的任何字符。
[^-] (28)
以下正则表达式匹配字符a之后不是字符串b的字符串。
a[^b] (29)
使用工具Regex Tester测试正则表达式(29),结果如图所示。
元字符/s能够匹配的空白字符,如空格、制表符、换行符、中文全角空格等。以下正则表达式首先匹配一个单词字符,然后匹配一个空白字符,最后匹配一个单词字符。
/w/s/w (15)
元字符/S能够匹配的非空白字符,即除空格、制表符、换行符、中文全角空格等字符之外的字符。以下正则表达式首先匹配一个非空白字符,然后匹配一个空白字符,最后匹配一个非空白字符。
/S/s/S (16)
使用工具Regex Tester分别测试正则表达式(15)和(16),结果分别如图。/S和/w都能够匹配单词字符,但是,/S能够匹配除了单词字符之外的字符,如字符“/”、“*”等。
元字符/d能够匹配0~9中的任何数字。以下正则表达式匹配1位的整数(即小于10的整数)。
/d (17)
以下正则表达式匹配3位的整数(即大于999小于1000的整数)。
/d/d/d (18)
元字符/D能够匹配除0~9之外的任何字符。以下正则表达式匹配以数字开头的、非数字字符结尾的字符串,且数字字符是该字符串的第一个字母。
/b/d/D (19)
使用工具Regex Tester分别测试正则表达式/d/d/d和/b/d/D,结果分别如图所示。
正则表达式的常用元字符(^、$、/b、.、/w、/W、/s、/S、/d和/D),它们功能的描述说明如表2-1所示。
表2-1常用元字符
字符
|
说明
|
^
|
匹配行的开始位置。
|
$
|
匹配行的结束位置。
|
/b
|
匹配单词的开始或结束位置。
|
.
|
匹配除换行符号之外的任意字符。
|
/w
|
匹配单词字符(包括字母、数字、下划线和汉字)。
|
/W
|
匹配任意的非单词字符(包括字母、数字、下划线和汉字)。
|
/s
|
匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等。
|
/S
|
匹配任意的非空白字符。
|
/d
|
匹配任意的数字。
|
/D
|
匹配任意的非数字字符。
|
元字符.能够匹配除换行符号之外的任意字符,如大写字母、小写字母、数字、_(下划线)等。以下正则表达式匹配以除换行符号之外的任何字符分割字符串“2007”、“06”、“22”的字符串。
2007.06.22 (13)
元字符/W能够匹配除单词字符之外的任意字符。以下正则表达式匹配长度为2的字符串,且该字符串不包括单词字符。
/W/W (14)
使用工具Regex Tester测试正则表达式2007.06.22,结果如图2.3所示。使用工具Regex Tester测试正则表达式/W/W,结果如图2.4所示。在图2.4的结果中,匹配了3个结果:“?”、“*”和“**”。在第一个结果中,正则表达式/W/W中的第一个/W匹配字符“?”的上一行的换行符号,第二个/W才匹配字符“?”。在第三个结果中,正则表达式/W/W中的每一个/W都匹配字符“*”。
匹配字符的元字符包括7个字符:.(点号)、/w、/W、/s、/S、/d和/D。其中,.(点号)匹配除换行符号之外的任意字符;/w匹配单词字符(包括字母、数字、下划线和汉字);/W匹配任意的非单词字符;/s匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等;/S匹配任意的非空白字符;/d匹配任意的数字;/D匹配任意的非数字字符。以下正则表达式匹配一个非空行,该行中可以包含除换行符号之外的任意字符。
^.$ (9)
以下正则表达式匹配一个非空行,且该行中只能包含字母、数字、下划线和汉字中的任意字符。
^/w$ (10)
以下正则表达式匹配以字母“a”开头的长度等于8的任意单词。
/ba/w/w/w/w/w/w/w/b (11)
正则表达式/ba/w/w/w/w/w/w/w/b匹配单词“anterior”的方式如图所示。
以下正则表达式匹配以字母“a”开头的、后跟随形如“3个字符”+“3个字符”+“1个非数字字符”的、长度等于8的任意单词。
/ba/w/w/w/d/d/d/D/b (12)
正则表达式/ba/w/w/w/d/d/d/D/b匹配单词“ante123_”的方式如图2.2所示。
匹配位置的元字符包括3个字符:^、$和/b。其中,^(脱字符号,通常在文章中插入字时使用)和$(美元符号)都匹配一个位置,它们分别匹配行的开始和结尾。以下正则表达式匹配以“String”开头的行,即被匹配的行的第一个字符串为“String”。
^String (1)
以下正则表达式匹配以“String”结尾的行,即被匹配的行的最后一个字符串为“String”。
String$ (2)
以下正则表达式匹配以“String”开始和结尾的行,即被匹配的行的第一个字符串和最后一个字符串都为“String”。实际上,该行只包含字符串“String”。
^String$ (3)
以下正则表达式匹配一个空行,该行中不包含任何字符串。
^$ (4)
以下正则表达式匹配任意行。该表达式只匹配行中的开始位置,因为任意行都包括其开始位置,所以该表达式将匹配任意行。
^ (5)
元字符/b和^、$具有相似性,它也是匹配一个位置。/b可以匹配单词的开始或结尾,即单词的分界处。通常情况下,英文单词往往由空格符号或标点符号或换行符号来分隔,但是元字符/b不匹配空格符号、标点符号和换行符号中的任何一个,它仅仅匹配一个位置。以下正则表达式匹配以“Str”开头的字符串,如“String”、“String Format”等。
/bStr (6)
正则表达式/bStr匹配的字符串必须“Str”开头,且“Str”之前是单词的分界处。正则表达式/bStr不能描述或限定“Str”之后的字符串的形式。以下正则表达式匹配以“ing”结尾的字符串,如“String”、“This is a String”等。
ing/b (7)
正则表达式ing/b匹配的字符串必须“ing”结尾,且“ing”之后是单词的分界处。以下正则表达式匹配一个完整的单词“String”。
/bString/b (8)
注意:在某些特定环境或语言下,还可以分别采用/<和/>来匹配单词的开始和结束位置。它们在效果上和元字符/b等效,即都匹配单词的边界这两个位置(开始位置和结束位置)。
在正则表达式中,元字符(Metacharacter)是一类非常特殊的字符,它能够匹配一个位置或字符集合中的一个字符,如.、/w等。根据功能,元字符可以分为两种类型:匹配位置的元字符和匹配字符的元字符。
本章节主要介绍正则表达式的基础理论,这些理论将为编写正则表达式提供法则和规范。正则表达式主要包括以下基础理论。
元字符;
字符类;
字符转义;
反义;
限定符;
替换;
分组;
反向引用;
零宽度断言;
负向零宽度断言;
匹配选项;
注释;
优先级顺序;
递规匹配。
注意:对于不同的编程语言而言,正则表达式的基础理论可能存在一些差别。譬如,一些编程语言(如PHP)使用字符/<、/>分别匹配单词的开始和结束位置;一些编程语言(如C#)使用字符/b匹配单词的开始和结束位置。如果本书未做特殊说明,那么书中所采用的正则表达式基础理论是与.NET Framework兼容的。