正则表达式:认识与基础

如何理解正则表达式,正则表达式中有哪些元字符?

Word的查找功能,也支持正则表达式(MS-HELP),你知道吗?

概述

正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征。正如自然语言中“高大”、“坚固”等词语抽象出来描述事物特征一样,正则表达式就是字符的高度抽象,用来描述字符串的特征。

正则表达式(以下简称正则,Regex)通常不独立存在,各种编程语言和工具作为宿主语言提供对正则的支持,并根据自身语言的特点,进行一定的剪裁或扩展。

对于字符串“a5”,是由两个字符“a”、“5”以及三个位置组成的,这一点对于正则表达式的匹配原理理解很重要。

基础

正则表达式由两种字符构成。一种是在正则表达式中具体特殊意义的“元字符”,另一种是普通的“文本字符”。

元字符可以是一个字符,如“^”,也可以是一个字符序列,如“\w”。

字符组

字符组可以匹配[ ]中包含的任意一个字符。虽然可以是任意一个,但只能是一个。字符组支持由连字符“-”来表示一个范围。当“-”前后构成范围时,要求前面字符的码位小于后面字符的码位。

[^…] 排除型字符组。排除型字符组表示任意一个未列出的字符,同样只能是一个。排除型字符组同样支持由连字符“-”来表示一个范围。

表达式说明
[abc]表示“a”或“b”或“c”
[0-9]表示0~9中任意一个数字,等价于[0123456789]
[\u4e00-\u9fa5]表示任意一个汉字
[^a1<]表示除“a”、“1”、“<”外的其它任意一个字符
[^a-z]表示除小写字母外的任意一个字符

举例:

[0-9][0-9] 在匹配“Windows 2003”时,匹配成功,匹配的结果为“20”。

[^inW] 在匹配“Windows 2003”时,匹配成功,匹配的结果为“d”。

预定义字符集

对于一些常用的字符范围,如数字等,由于非常常用,即使使用[0-9]这样的字符组仍显得麻烦,所以定义了一些元字符,来表示常见的字符范围。

小写是匹配,大写是不匹配。w字母数字下划线,d数字,s空白字符。

表达式说明
\d任意一个数字,相当于[0-9],即0~9 中的任意一个
\w任意一个字母或数字或下划线,相当于[a-zA-Z0-9_]
\s任意空白字符,相当于[ \r\n\f\t\v]
\D任意一个非数字字符,\d取反,相当于[^0-9]
\W\w取反,相当于[^a-zA-Z0-9_]
\S任意非空白字符,\s取反,相当于[^ \r\n\f\t\v]
.匹配除了换行符 \n 以外的任意一个字符;
如果要匹配包括“\n”在内的所有字符,一般用[\s\S]。

举例:

\w\s\d 在匹配“Windows 2003”时,匹配成功,匹配的结果为“s 2”。

定位符

定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。

定位符用来描述字符串或单词的边界,^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

字符描述
^从行首位置开始匹配。
$从行未位置检查匹配。
\b \B单词界定\b与非单词界定\B
注意:是否匹配一个词边界,各软件定义不一样的。

举例:

^a 在匹配“cba”时,匹配失败,因为表达式要求开始位置后面是字符“a”。

^The 匹配行开头为the/THE(大小写区分,取决于当前软件是否支持),但athe不是。

end$ 匹配行结尾为end/END(大小写区分,取决于当前软件是否支持),但enda不是。

\d$ 在匹配“123”时,匹配成功,匹配结果为“3”,这个表达式要求匹配结尾处的数字,如果结尾处不是数字,如“123abc”,则是匹配失败的。

单词界定\b与非单词界定\B

示例内容:Chapter 1Chapter Chapter2

示例内容:中华人民共和国 a中华人民共和国 中华人民共和国b

非打印字符

字符描述
\cx匹配由x指明的控制字符。
例如\cM匹配一个Control-M或回车符,x的值必须为A-Z或a-z之一。
\f匹配一个换页符。等价于\x0c和\cL。
\n匹配一个换行符。等价于\x0a和\cJ。
\r匹配一个回车符。等价于\x0d和\cM。
\t匹配一个制表符。等价于\x09和\cI。
\v匹配一个垂直制表符。等价于\x0b和\cK。

\r\n使用时,要注意当前软件与OS的区别,有的软件正则式中,是不区分,有的是区分的;而OS中,Windows的同时有\r\n,Mac与Linux又不一样的。

转义字符

如果在正式表式中查找(正式表达工自身字符)时,前缀转义字符即可。

将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。

转义字符\
举例匹配$字符:\$      匹配*字符:\*      匹配+字符:\+      匹配.字符:\.        
匹配[字符:\[      匹配?字符:\?      匹配/字符:\/      匹配\字符:\\
匹配{字符:\{
例外在[]中不需要转义字符。 因为不会这样书写:^写成[^]、d-z写成[d-]

/:在某些语言中表示正则表达式的开始或结束,而VBScript中使用“”做边界符。

子表达式

字符说明举例
|多个子表达式之间取“或”的关系;如是字符串可书写任意长度。(t|T)(h|H) 等价为[tT][hH],也等价为(Th|tH|th|TH) 注意:不同软件对大小写定义不一样。
( )要匹配的表达式,获取后可以反向引用(见捕获组)。()里可以放[]{},但[]{}里不能放() 

举例:

^aa|b$ 在匹配“cccb”时,是可以匹配成功的,匹配的结果是“b”,因为这个表达式表示匹配“^aa”或“b$”,而“b$”在匹配“cccb ”时是可以匹配成功的。

^(aa|b)$ 在区配“cccb”时,是匹配失败的,因为这个表达式表示在“开始”和“结束”位置之间只能是“aa”或“b”,而“cccb”显然是不满足的。

量词:匹配的次数

量词表示一个子表达式可以匹配的次数。量词可以用来修饰一个字符、字符组,或是用()括起来的子表达式。一些常用的量词被定义成独立的元字符。

字符说明举例
?匹配前面的子表达式0次或1次。 等价为{0,1}ab? 匹配a或ab或abb。
*匹配前面的子表达式0次或任意多次。 等价为{0,}[^a]* 匹配b或ca,不是a或ab。
+匹配前面的子表达式1次或任意多次。 等价为{1,}\d\s+\d 两个数字中间至少有一个以上的空白字符。
{m,n}前面子表达式的匹配长度,有以下三种形式: {m}:匹配前面的子表达式m次,所以{1}无意义。{m,n}:匹配前面的子表达式最少m次,最多n次。{m,}:匹配前面的子表达式至少m次。\d{3} 相当于\d\d\d (abc){2} 相当于abcabc \d{2,3} 匹配2-3位的数字。 [a-z]{8,} 至少8位以上的字母 ^[0-9]{1,20}$:仅1-20位的数字行。

举例:

^[a-zA-Z]{1}([a-zA-Z0-9]|[.@_]){4,19}$ 匹配以字母开头,可带数字小数点@下划线的长度5-20字符串的行。

模式修饰符

模式修饰符的作用是设定模式。也就是规定正则表达式应该如何解释和应用。不同的语言/软件都有自己的模式设置,所以了解即可。PHP中的主要模式如表所示:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注