1、正则表达式概述
正则表达式分为:基础正则表达式与扩展正则表达式,它不是一个工具程序,而是一个字符串处理的标准依据,是使用单个字符串、匹配一系列符合某个语法规则的字符串。正则表达式由普通字符与元字符组成。
普通字符:包括大小写字母、数字、标点符号及一些其他符号
元字符:正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符在目标对象中的出现模式
1.1、支持工具
支持正则表达式的工具:vim,grep,egrep,sed,awk
2、基础正则表达式
2.1、基础元字符
| 元字符 | 作用 |
|---|---|
| \ | 转义字符,用于取消特殊符号的含义,如:!,\n 等 |
| 匹配字符串的开始位置(以...开头)如:^world 匹配以world开头的行 | |
| $ | 匹配字符串的结束位置(以...结尾)如:world$ 匹配以world结尾的行 |
| . | 匹配除\n(换行)之外的任意一个字符 |
| * | 匹配前面的子表达式(前一个字符)0次或者多次 |
| [list] | 匹配 list 列表中的一个字符 如:[0-9] 匹配任意一个数字 |
| [^list] | 匹配不在 list 列表中的一个字符(反选)如:[^0-9]匹配任意一个非数字 |
| \{n\} | 匹配前面的子表达式(前一个字符)n次 如:[0-9]\{2\} 匹配两位数 |
| \{n,\} | 匹配前面的子表达式不少于n次 如:[0-9]\{2,\} 表示两位或两位以上的数字 |
| \{n,m\} | 匹配前面子表达式n到m次 如:[a-z]\{2,3\} 匹配两到三位的小写字母 |
| \w | 匹配包括下划线的任何单词字符 如:[A-Za-z0-9_] |
| \W | 匹配任意一个非单词字符 如:[^A-Za-z0-9_] |
| \d | 匹配一个数字字符 等价于[0-9] |
| \D | 匹配一个非数字字符 等价于[^0-9] |
| \s | 空白符 |
| \S | 非空白符 |
- tips:egrep 、awk使用{n}、{n,}、{n,m}匹配时 "{}"前不用加"\"
2.2、示例:
[root@localhost ~]# grep "^root" /etc/passwd ## 匹配以"root" 开头的行
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd ## 匹配以"bash" 结尾的行
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# cat test.txt
gd
god
good ## 准备示例测试用的文件
goood
gooood
goooabcd
gooooood
gooooooddddd
abccba
abccba123
oooogooood
oooogd
gold
goad
golad
goold
goolad
go8d
goAd
go;d
[root@localhost ~]# grep "goo*d" test.txt ## 匹配*号前面"o" 0次或者多次
god
good
goood
gooood
gooooood
gooooooddddd
oooogooood
[root@localhost ~]# grep "goo.d" test.txt ## 除\n(换行)之外的任意一个字符
goood
[root@localhost ~]# grep "go\{2\}d" test.txt ##匹配"o" 两次
good
[root@localhost ~]# grep "go[ola]\{2\}d" test.txt
goood
golad ## 匹配 [ola] 列表里面任意一个字符两次
goold
[root@localhost ~]# grep "go\{2,\}d" test.txt
good
goood ## 匹配"0" 不少于2次(次数>=2)
gooood
gooooood
gooooooddddd
oooogooood
[root@localhost ~]# grep "go\{2,3\}d" test.txt
good
goood ## 匹配"o" 两次或者3次
3、扩展正则表达式
扩展正则表达式是对基础正则表达式的扩充和深化
3.1、支持工具
扩展正则表达式支持工具:egrep、awk grep -E、sed -r
3.2、扩展元字符
| 元字符 | 作用 |
|---|---|
| + | 匹配前面的子表达式1次以上,如:go+d ,将匹配至少一个"o" |
| ? | 匹配前面的子表达式0次或者1次,如:go?d,将匹配 gd 或者 god |
| () | 将()号中的字符串作为一个整体,如:(xyz)+,将匹配xyz整体1次以上 |
| | | 以或的方式匹配字符串,如:good | great,将匹配 good 或者 great |
3.3、示例:
[root@localhost ~]# cat test.txt
gd
god
good ## 准备示例测试用的文件
goood
gooood
goooabcd
gooooood
gooooooddddd
abccba
abccba123
oooogooood
oooogd
gold
goad
golad
goold
goolad
go8d
goAd
go;d
[root@localhost ~]# egrep "go+d" test.txt
god
good ## 匹配"o" 1次及以上多次
goood
gooood
gooooood
gooooooddddd
oooogooood
[root@localhost ~]# egrep "go?d" test.txt
gd
god ## 匹配 "o" 0次或者1次
oooogd
[root@localhost ~]# egrep "g(oo)+d" test.txt
good
gooood ## 匹配 以"oo"为整体的字符串1次及其以上多次
gooooood
gooooooddddd
oooogooood
[root@localhost ~]# egrep "g(oo|oa)d" test.txt
good
goad ## 匹配以 "oo" 或者 "oa" 为整体的
4、正则例题 1:筛选正确的座机号码
- 以025 区号为例:
区号: ^025 ## 以区号 025 开头
连接符:[- ]? ## 区号与后8位号码 中间连接符"-" 或者" "0次或者1次
号码 :[58][0-9]{7}$ ## 以5或者8开头后面7位号码随机数字
整体表达式:egrep "^025[- ]?[58][0-9]{7}$"
5、正则例题 2:筛选正确的邮箱格式
要求:
-
用户名@:长度要求在6-18位,任意大小写英文,任意数字,除了"@"符号和空格以外的其他任意符号字符,开头只能是 _ 或者字母
-
子域名.[二级域名]:长度任意,符号只能包含 "-" "_" "."
-
.顶级域名:长度在2-5,任意大小写英文
用户名@:^[_A-Za-z][^@ ]{5,17}@
子域名.[二级域名]:[A-Za-z0-9_\-\.]+
顶级域名:\.([A-Za-z]{2,5})$
整体表达式:egrep "^[_A-Za-z][^@ ]{5,17}@[A-Za-z0-9_\-\.]+\.([A-Za-z]{2,5})$"