参考
这是我讲述正则表达式的“教案”,你也可以用来作为正则表达式手册。
正则表达式
1. 基本字符
说明:本文在表述正则表达式时,用方框扩起来的字符(示例:x
)表示具体的字符,而不用方框扩起来的字符,表示一类字符,比如用“x”表示一个字符,并不一定是x
。
正则表达式 | 匹配 | 说明 |
---|---|---|
x | 字符x | 匹配一个字符,区分大小写,示例:a 匹配字符a , A 匹配字符A ,7 匹配字符7
|
注意:编程语言的正则表达式默认是区分大小写的,而编辑器默认不区分大小写。
基本字符能直接匹配,有些字符为特殊字符,在正则表达式里有特殊意义,不能直接匹配。比如.
并不是匹配.
而是可以匹配多个字符。正则表达式里一个字符可以表示多种意义,比如7
可以匹配字符7
,在不同的位置,也可以有其它意义。这些在后文都会讲到。
2. 转义字符
说明:本文在表述正则表达式时,用方框扩起来的字符(示例:x
)表示具体的字符,而不用方框扩起来的字符,表示一类字符,比如用“x”表示一个字符,并不一定是x
。
正则表达式 | 匹配 | 说明 |
---|---|---|
x | 字符x | 匹配一个字符,区分大小写,示例:a 匹配字符a , A 匹配字符A ,7 匹配字符7
|
\\ |
字符\
|
|
\0nnn | 一个字符的ASCII码是八进制值nnn |
\0 开头,最多3位8进制,示例:\0101 匹配字符A 。\09 表示Tab键 |
\xhh | 一个字符的ASCII码是十六进制值hh |
\x 开头,最多2位16进制,示例:\04E 和\04e 匹配字符N
|
\t |
tab字符 | 等同\x09
|
\n |
换行符 | 等同\x0a
|
\r |
回车符 | 等同\x0d
|
\a |
响铃符 | 等同\x07
|
\e |
escape字符 | 等同\x1b
|
重要说明:字符串内反斜杠\
在常见的编程语言里都要转义"\\"
,而正则表达式里斜杠也要转义。就存在两次转义的问题。
比如正则表达式"\\\\"
在编程语言里匹配字符\
,因为四个反斜杠"\\\\"
在字符串内,其实只表示两个反斜杠,正则表达式两个反斜杠表示字符\
。
Python编程语言的r字符串不需要转义,re.match(r'\\', '\\')
等同re.match('\\\\', '\\')
学习正则表达式比较方便。
上面表格内并没有包括所有转义字符,后文会继续补充。
3.匹配多次
正则表达式a
表示匹配字符a
,如果要匹配字符aa
,用正表达式aa
,如果匹配100个a
呢,可以用a{100}
,更多情况见下表
正则表达式 | 匹配 | 说明 |
---|---|---|
x{n,m} | n到m个x字符 | n和m为自然数,m≥n |
x{n,} | n个以上x字符 | |
x{n} | n个x字符 | 等价{n,n} |
x+ | 1个以上x字符 | 等价x{1,} |
x? | 0个或1个x字符 | 等价x{0,1} |
x* | 0个或多个x字符 | 等价x{0,} |
上面的表格出现了几个新的字符{
,}
,,
,+
,?
,*
其中{
,}
,,
如果不是用作范围限定符,在不引起混淆的情况下可不转义,可以直接匹配这些字符。但要匹配这些字符本身+
,?
,*
就要转义。如下表:
正则表达式 | 匹配 | 说明 |
---|---|---|
\} |
} |
不引起混淆的情况可不转义 |
\{ |
} |
不引起混淆的情况可不转义 |
\, |
, |
不引起混淆的情况可不转义 |
\+ |
+ |
|
\? |
? |
|
\* |
* |
4. 正则表达式的流派(flavor)
类Unix操作系统的很多命令是支持正则表达式的,比如grep
命令。
我们在macOS终端输入下面的命令:
echo aaaa|grep 'a{4}'
并不能够匹配。
改成这样:
echo aaaa|grep 'a\{4\}'
就可以匹配。
这是什么原因呢?这是因为grep命令的正则表达式花括号表示的意义和上文所讲的是相反的。即:}
表示字符本身,用作范围符号需要转义\}
。
同一个正则表达式在不同的工具、编程语言表示的意义不同,这种现象叫做正则表达式的流派问题。
这个教程是什么流派呢?Perl 5流派,Perl 5.0版出现的早,而且正则表达式支持强大,很多编程语言实现都以此标准。
正则表达式的流派问题,会导致你在一个环境测试通过的正则表达式,在另一个环境可能不适用。所以移植正则表达式时一定要充分测试。
网友评论