什么是正则表达式?

正则表达式(Regular expression)是一种字符模式,用于在查找过程中匹配指定的字符。

匹配数字^[0-9]+$ 比如:123 456

[root@localhost ~]# num1=123
[root@localhost ~]# num2=456
[root@localhost ~]# num3=7w9

[root@localhost ~]# [[ "$num1" =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
[root@localhost ~]# [[ "$num2" =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
yes
[root@localhost ~]# [[ "$num3" =~ ^[0-9]+$ ]] && echo "yes" || echo "no"
no

匹配mail[a-z0-9_]+@[a-z0-9]+\.[a-z]+ 比如:ls12345666@qq.com

匹配IP[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}
例:

[root@localhost ~]# egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' /etc/sysconfig/network-scripts/ifcfg-ens33 
IPADDR=192.168.1.11
GATEWAY=192.168.1.2
DNS1=114.114.114.114

正则表达式元字符

定义:元字符是这样一类字符,它们表达的是不同于字面本身的含义
shell元字符(也称通配符) 由Shell来解析,如 rm -rf *.txt, 元字符 * Shell将其解析俄日任意多个字符
正则表达式元字符 由各种执行模式匹配操作的程序类解析,比如vi、grep、sed、awk、python

基本正则表达式元字符

元字符 功能 示例
^ 行首定位符 ^love
$ 行尾定位符 love$
. 匹配单个字符 l..e
* 匹配前导符0到多次 ab*love
.* 任意多个字符
[] 匹配指定范围内的一个字符 [lL]ove
[ - ] 匹配指定范围内的一个字符 [a-z0-9]ove
[ ^ ] 匹配不在指定组内的字符 [^a-z0-9]ove
\ 用来转义元字符 love.
\< 词首定位符 \<love
> 词尾定位符 love>
(..) 匹配稍后使用的字符标签
x{m} 字符x重复出现m次 a{5}
x{m,} 字符x重复出现m次以上 a{5,}
x{m,n} 字符x重复出现m到n次 a{5,10}

扩展正则表达式元字符

元字符 功能 示例
+ 匹配一个或多个前导字符 [a-z]+ove
匹配零个或一个前导字符 lo?ve
a丨b 匹配a或者b love丨hate
() 组字符 loveable\rs love(able丨rs)ov+ (ov)+
()()1\2 标签匹配字符 (love)able\1er
x{m} 字符x重复m次 a{5}
x{m,} 字符x重复至少m次 a{5,}
x{m,n} 字符x重复m到n次 a{5,10}

POSIX字符类

表达式 功能 示例
[:alnum:] 字母与数字 [[:alnum:]]+
[:alpha:] 字母 [[:alpha:]]{4}
[:blank:] 空格与制表符 [[:blank:]]*
[:digit:] 数字字母 [[:digit:]]?
[:lower:] 小写字母 [[:lower:]]{5,}
[:upper:] 大写字母 [[:upper:]+
[:punct:] 标点符号 [[:punct:]
[:space:] 包括换行符,回车等在内的所有空白 [[:space:]]+

例子:

[root@localhost ~]# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

[root@localhost ~]# grep 'bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
shuai:x:1000:1000:shuai:/home/shuai:/bin/bash

[root@localhost ~]# grep 'r..t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

[root@localhost ~]# grep 'ro*t' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin

[root@localhost ~]# grep '.*' /etc/passwd
# 会显示/etc/passwd文件所有内容

[root@localhost ~]# grep 'Root' /etc/passwd
[root@localhost ~]# grep '[Rr]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# grep '[a-z]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin

[root@localhost ~]# grep '[^0-9]oot' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
setroubleshoot:x:990:984::/var/lib/setroubleshoot:/sbin/nologin

[root@localhost ~]# grep '\<root\>' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# grep 'ro\{2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# grep 'ro\{2,\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

[root@localhost ~]# grep 'ro\{2,5\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

练习

1.匹配手机号

如:18601236789

[0-9]{11}

2. 匹配中国座机号

如:022-54673286、0123-8310573

[0-9]{3,4}\-[0-9]{7,8}

匹配一个0~999之间的任意数字

^[1-9]{0,3}|0$

选出含有ftp的链接,且文件类型是gz或者xz的文件名

^(ftp://).*(gz|xz)$
Last modification:July 24th, 2020 at 10:12 pm
如果觉得我的文章对你有用,请随意赞赏