RE

在线检测:

https://www.regexpal.com/

RE分为BRE(basic RE), ERE(extended RE), SRE(simpla RE).

在BRE中+?(){}|没有特殊含义,除非用\转义.

在ERE中+?(){}被保留有特殊含义,除非用\转义才表示普通字符.

命令find, grep, sed, awk等都可以使用正则表达式.

特殊字符含义:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
()      对正则表达式分组, ERE
\n      再匹配前面的分组n次

.       匹配任意单个字符, 换行符除外
^tux    匹配以tux开始的行
tux$    匹配以tux结束的行

*+?{}特殊字符是贪婪匹配模式,也就是尽可能多的匹配
*           匹配前面一个字符0次或多次,包括前面这个字符本身
+           匹配前面一个字符1次或多次,包括前面这个字符, ERE
?           匹配前面一个字符0次或1次,包括前面这个字符, ERE
{n}         匹配前面一个字符n次,包括前面这个字符, ERE
{min,}      匹配前面一个字符至少min次,包括前面这个字符, ERE
{min,max}   匹配前面一个字符至少min次,最多max次,包括前面这个字符, ERE

下面是非贪婪匹配模式
*?    匹配0个或多个
+?    匹配1个或多个
??    匹配0个或1个
{n}?        只匹配n个
{min,}?     至少min个
{min,max}?  至少min个,最多max个

[abc]   匹配包含在[]中的任意一个字符,除了\, ^, -三个特殊字符
[^abc]  匹配不包含在[]中的任意一个字符(和上面相反)
[a-z]   匹配[]中指定范围内的任意一个字符
[abc\?] 用\转义[]中的特殊字符

|       表示逻辑或, ERE

\       转义字符,将特殊字符转义成普通字符

小括号表示分组
(...)
(?...)
(?iLmsux)
(?:...)
(?P<name>...)
(?P=name)
(?#...)
(?=...)
(?!...)
(?<=...)
(?<!...)
(?(id/name)yes-pattern|no-pattern)

匹配前面一个字符0次,包括前面这个字符,也就是说0次表示不匹配前面这个字符.

字符集:

下列字符集是posix标准,用在[]中,也就是[[:alnum:]].

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[:alnum:]    可打印的字符,包括空白字符
[:alpha:]  字母字符
[:blank:]  空格和制表符,space, \t
[:cntrl"]    控制字符
[:digit:]  数字字符
[:graph:]  图形字符,不包括空白字符
[:lower:]  小写字符
[:print:]  可打印字符,包括空白字符
[:punct:]  标点符号字符
[:space:]  空白字符
[:upper:]  大写字符
[:xdigit:]  十六进制字符

字符集的简写(不同的编程语言可能不同):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
\b      匹配单词边界
\B      匹配单词的非边界
\A      匹配字符串的起始
\Z   匹配字符串的结束

\d      匹配任何数字0-9
\D      匹配任何非数字,等效[^\d]
\w      匹配任何数字和字母,a-z,A-Z,0-9
\W      匹配任何非数字和非字母
\s      匹配任何空白字符,包括space,\t,\n,\r,\f
\S      匹配任何非空白字符
\h      匹配横向空白,包括space,\t
\v      匹配纵向空白,包括\f,\r,\n
\r      回车
\R   匹配任何类型的断行

\a
\f
\t
\n

常用正则表达式

1
2
3
4
5
6
.*           匹配任意字符0次或多次,除了换行符
^$           匹配空白行
[\s\S]       匹配任何空白字符和非空白字符
^\s\+        行首空格
\s\+$        行尾空格
^[^<]        不以<开头的字符串