正则表达式

​ REGEXP:Regular Expressions。由一类特殊字符及文本字符所编写的模式,其中有些字符不表示字符的字面意义,而表示控制或通配的功能,类似增强版的通配符功能。但于通配符不同,通配符的作用是处理文件名,而正则表达式则是处理文本内容中的字符。

​ 正则表达式被很多程序和开发语言所广泛支持:vim、less、grep、sed、awk、nginx、mysql等

正则表达式也分两类:

  • 基本正则表达式:BRE
  • 扩展正则表达式:ERE

​ 正则表达式引擎:采用不同算法,检查处理正则表达式的软件模块。如:PCRE(Perl Compatible Regular Expressions)

​ 正则表达式的元字符分类:字符匹配次数匹配位置锚定分组

如何查看正则表达式的帮助:man 7 regex

基础正则表达式

字符匹配

[] 作用是匹配其中的任意单个字符

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
.				#匹配任意单个字符
[] #匹配指定范围内的任意单个字符
[^] #匹配指定范围外的任意单个字符
[0-9] #匹配数字
[a-z] #匹配小写字母
[A-Z] #匹配大写字母
[demo] #匹配列表中的任意一个字符
[^demo] #匹配列表中以外的任意一个字母

[:digit:] #匹配任意数字,等同于0-9
[:lower:] #匹配任意小写字母
[:upper:] #匹配任意大写字母
[:alpha:] #匹配任意大小写字母
[:alnum:] #匹配任意数字或字母
[:blank:] #匹配水平空白字符
[:space:] #匹配水平或垂直空白字符
[:punct:] #匹配标点符号
[:print:] #匹配可打印字符
[:cntrl:] #匹配控制(非打印)字符
[:graph:] #匹配图形字符
[:xdigit:] #匹配十六进制字符

\s #匹配任何空白字符。包括空格、制表符、换页符等等。等价于[\f\r\t\v],Unicode正则表达式会匹配全角空格符
\S #匹配任何非空白字符。等价于[^\f\r\t\v]
\w #匹配一个字母、数字、下划线、汉字、其它国家文字的字符,等价于[_[:alnum:]汉字]
\W #匹配一个非字母、数字、下划线、汉字、其它国家文字的字符,等价于[^_[:alnum:]汉字]

匹配次数

​ 用在要指定次数的字符后,用于指定前面的字符出现次数

1
2
3
4
5
6
7
8
*				#匹配前面字符任意次,包括0次。但如果可能,尽可能长的匹配
.* #任意长度的任意字符
\? #匹配前面的字符0次或1次。即:可有可无
\+ #匹配前面字符最少一次。即至少有1次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符最少m次,最多n次
\{,n\} #匹配前面的字符最多n次
\{n,\} #匹配前面的字符最少n次

位置锚定

位置锚定用于定位字符出现的位置

1
2
3
4
5
6
7
8
9
10
^				#行首锚定,用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #匹配空行
^[[:space:]]*$ #空白行
\<或\b #词首锚定,用于单词模式的左侧
\>或\b #词尾锚定,用于单词模式的右侧
\<PATTERN\> #匹配整个单词

#注:单词是由字母、数字、下划线组成

分组及其它

分组

​ 分组:使用小括号()将多个字符捆绑在一起,当作一个整体处理(括号也需要用\转义)

​ 后向引用:分组括号中的模式所匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1、\2、\3、…

​ \1表示从左侧起第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符

注:\0表示正则表达式所匹配的所有字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ab,然后c出现3次
"abc\{3\}"

#abc作为一个整体出现3次
"\(abc\)\{3\}"

#后向引用
"\(abc\)\1"
"\(abc\)\1\1"
#\1表示引用第一个分组所匹配到的内容

#\1也可以接正则
"\(abc\)\1\{3\}"

#取IP
"\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"

或者

或者:|

1
2
3
a\|b			#a或b
C\|cat #C或cat
\(C\|c\)at #Cat或cat

扩展正则表达式元字符

字符匹配

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.				#任意单个字符
[zhou] #指定范围的字符
[^zhou] #不在指定范围的字符
[:alnum:] #字母和数字
[:alpha:] #任何英文大小写字符
[:lower:] #小写字母
[:upper:] #大写字母
[:blank:] #空白字符(空格和制表符)
[:space:] #水平和垂直的空白字符(比[:blank:]包含的范围更广)
[:cntrl:] #不可打印的控制字符(退格、删除、警铃...)
[:digit:] #十进制数字
[:xdigit:] #十六进制数字
[:graph:] #可打印的非空白字符
[:print:] #可打印字符
[:punct:] #标点符号

匹配次数

1
2
3
4
5
*				#匹配前面字符任意次
? #0或1次
+ #1次或多次
{n} #匹配n次
{m,n} #至少m次,至多n次

位置锚定

1
2
3
4
^				#行首
$ #行尾
\<,\b #词首
\>,\b #词尾

分组其它

1
2
3
4
5
()分组			#后向引用:\1,\2,... 注意:\0表示正则表达式匹配的所有字符
| #或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat