正则表达式
1. 正则表达式分类
正则表达式:REGEXP,REGular EXPression。
正则表达式分为两类:
- Basic REGEXP(基本正则表达式)
- Extended REGEXP(扩展正则表达式)
2. 基本正则表达式
//元字符
. //任意单个字符
[] //匹配指定范围内的任意单个字符
[^] //匹配指定范围外的任意单个字符
//匹配次数(贪婪模式)
* //匹配其前面的任意单个字符任意次
.* //任意长度的任意字符
\? //匹配其前面的任意单个字符1次或0次
\+ //匹配其前面的任意单个字符至少1次
\{m,n\} //匹配其前面的任意单个字符至少m次,至多n次
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
^$ //空白行
\<或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
/分组
\(\)
例:\(ab\)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
3. 扩展正则表达式
//字符匹配
. //匹配任意单个字符
[] //匹配指定范围内的任意单个字符
[^] //匹配指定范围外的任意单个字符
//次数匹配
* //匹配其前面的任意单个字符任意次
? //匹配其前面的任意单个字符1次或0次
+ //匹配其前面的任意单个字符至少1次
{m,n} //匹配其前面的任意单个字符至少m次,至多n次
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
^$ //空白行
\<或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
//分组
() //分组
\1,\2,\3,....
例:(ab)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
//或者
| //or 默认匹配|的整个左侧或者整个右侧的内容
//例:C|cat表示C或者cat,要想表示Cat或者cat则需要使用分组,如(C|c)at
4.实际测试
目标文件
[root@localhost ~]# cat abc
1
10
19
100
a
aa
ab
abb
abbbc
,
'abc'
''
-
*
/
-/
//元字符
. //任意单个字符
[] //匹配指定范围内的任意单个字符
[^] //匹配指定范围外的任意单个字符
[root@localhost ~]# cat abc | grep '^.$'
1
a
,
-
*
/
[root@localhost ~]# cat abc | grep '^[0-9]$'
1
基本正则表达式
//匹配次数(贪婪模式)
* //匹配其前面的任意单个字符任意次
.* //任意长度的任意字符
\? //匹配其前面的任意单个字符1次或0次
\+ //匹配其前面的任意单个字符至少1次
\{m,n\} //匹配其前面的任意单个字符至少m次,至多n次
扩展正则表达式
//次数匹配
* //匹配其前面的任意单个字符任意次
? //匹配其前面的任意单个字符1次或0次
+ //匹配其前面的任意单个字符至少1次
{m,n} //匹配其前面的任意单个字符至少m次,至多n次
[root@localhost ~]# cat abc | grep '^ab*$'
ab
abb
[root@localhost ~]# cat abc | grep '^a.*$'
a
aa
ab
abb
abbbc
[root@localhost ~]# cat abc | grep '^a\?b$'
ab
[root@localhost ~]# cat abc | grep '^a\+b$'
ab
[root@localhost ~]# cat abc | grep '^a{1,2}$'
ab
abb
//位置锚定
^ //锚定行首,此字符后面的任意单个字符必须出现在行首
$ //锚定行尾,此字符前面的任意单个字符必须出现在行尾
^$ //空白行
\<或\b //锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
[root@localhost ~]# cat abc | grep '^\<a$'
a
aa
ab
abb
abbbc
[root@localhost ~]# cat abc | grep '^c\>$'
abbbc
基本正则表达式
//分组
\(\)
例:\(ab\)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
扩展正则表达式
//分组
() //分组
\1,\2,\3,....
例:(ab)*
//后向引用
\1 //引用第一个左括号以及与之对应的右括号所包括的所有内容
\2 //引用第二个左括号以及与之对应的右括号所包括的所有内容
//或者
| //or 默认匹配|的整个左侧或者整个右侧的内容
//例:C|cat表示C或者cat,要想表示Cat或者cat则需要使用分组,如(C|c)at
[root@localhost ~]# cat abc | grep '^a*b\{1,2\}$'
ab
abb
实战案例
日期
[root@localhost ~]# cat day
13-22-15
12-10-24
03-06-24
09/24/2003
07/06/2003
03/25/1999
[root@localhost ~]# grep -E '^([01][0-2]|[0][1-9])[-/]([0-2][0-9]|3[01])[-/](19|20)?[0-9]{2}$' day
12-10-24
03-06-24
09/24/2003
07/06/2003
03/25/1999
时间
[root@localhost ~]# cat time
13-22-15 24:59:32
12-10-24 06:12:06
03-06-24 09:12:16
09/24/2003 23:12:12
07/06/2003 14:15:16
03/25/1999 11:55:15
[root@localhost ~]# grep -E '^([01][0-2]|[0][1-9])[-/]([0-2][0-9]|3[01])[-/](19|20)?([0-9]{2})\s+([0-2][0-3]|[0-1][4-9]):([0-5][0-9]):([0-5][0-9])$' time
12-10-24 06:12:06
03-06-24 09:12:16
09/24/2003 23:12:12
07/06/2003 14:15:16
03/25/1999 11:55:15
手机号
[root@localhost ~]# cat phone
1239194832875825
121259932582398
19219924435
18273159353
19432852526
19025436574
[root@localhost ~]# grep -E '^1[3-9][0-9]{9}$' phone
19219924435
18273159353
19432852526
19025436574
座机号
[root@localhost ~]# cat Landline
12306
12321
086-123127125812
2353924235
0724-12732523
325239532
[root@localhost ~]# grep -E '^([0-9]{3,4}-)?[0-9]{7,8}$' Landline
0724-12732523