参考
这是我讲述正则表达式的“教案”,你也可以用来作为正则表达式手册。
正则表达式
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版出现的早,而且正则表达式支持强大,很多编程语言实现都以此标准。
正则表达式的流派问题,会导致你在一个环境测试通过的正则表达式,在另一个环境可能不适用。所以移植正则表达式时一定要充分测试。









网友评论