正则表达式
一、基础的正则表达式
基础正则常见元字符(支付的工具:grep、egrep、sed、awk)
以下是正则表达式元字符及其说明的表格形式:
元字符 |
含义说明 |
示例 |
\ |
转义字符,用于取消特殊符号的含义 |
\! 、\n 、\$ 等 |
^ |
匹配字符串开始的位置 |
^a (匹配以a开头)、^the (匹配以the开头)、^# (匹配以#开头)、^[a-z] (匹配以小写字母开头) |
$ |
匹配字符串结束的位置 |
word$ (匹配以word结尾)、^$ (匹配空行) |
. |
匹配除 \n 之外的任意一个字符 |
lo.*k (lo后接任意字符多次再跟k)、lo.k (lo后接任意字符再跟k)、l..k (l后接两个任意字符再跟k) |
* |
匹配前面一个字符出现0次或多次 |
loo*k (lo后接0个或多个o再跟k)、lo*k (l后接0个或多个o再跟k) |
[list] |
匹配list列表中的一个字符 |
go[ola]d (匹配gold、good、goad)、[abc] (匹配a、b或c)、[a-z] (匹配任意小写字母)、[0-9] (匹配任意一位数字) |
[^list] |
匹配任意非list列表中的一个字符 |
[^0-9] (匹配非数字字符)、[^A-Z0-9] (匹配非大写字母和非数字字符)、[^a-z] (匹配任意非小写字母) |
\{n\} |
匹配前面一个字符n次 |
lo\{2\}k (匹配look,o出现2次)、[0-9]\{2\} (匹配两位数字) |
\{n,\} |
匹配前面一个字符不少于n次 |
lo\{2,\}k (o出现2次及以上,如look、loook等)、[0-9]\{2,\} (匹配两位及两位以上数字) |
\{n,m\} |
匹配前面一个字符n到m次 |
lo\{2,3\}k (o出现2-3次,如look、loook)、[0-9]\{2,3\} (匹配两位到三位数字) |
注: egrep、 awk使用 {n}、{n,}、 {n, m} 匹配时 "{}" 前不用加 "\"
二、案例
先写一个原始的文本文件
powershell
复制代码
[root@stw ~]# vim a.txt
[root@stw ~]# cat a.txt
lk
lok
look
loook
looooook
loooooaaak
looooooook
abbbbcd
abbbbcd666
ooooloooook
oooooolk
aoblck
1、*匹配前面一个字符0次或者多次
powershell
复制代码
[root@stw ~]# grep "loo*k" a.txt
lok
look
loook
looooook
looooooook
ooooloooook
[root@stw ~]# grep "lo*k" a.txt
lk
lok
look
loook
looooook
looooooook
ooooloooook
oooooolk
2、. 匹配除\n之外的任意的一个字符
powershell
复制代码
[root@stw ~]# grep "lo.*k" a.txt //匹配lo k,空格可以是任意字符且是一次或者多次
lok
look
loook
looooook
loooooaaak
looooooook
ooooloooook
[root@stw ~]# grep "lo.k" a.txt
look
[root@stw ~]# grep "l..k" a.txt
look
3、\{n\}
:匹配前面的一个字符出现n次
\{n,\}
:匹配前面的一个字符出现不少于n次
\{n,m\}
:匹配前面的一个字符出现n到m次
powershell
复制代码
[root@stw ~]# grep "lo\{2\}k" a.txt //匹配lk之间o出现2次
look
[root@stw ~]# grep "lo\{3\}k" a.txt //匹配lk之间o出现3次
loook
[root@stw ~]# grep "lo\{3,\}k" a.txt //匹配lk之间o出现3次及3次以上
loook
looooook
looooooook
ooooloooook
[root@stw ~]# grep "lo\{3,5\}k" a.txt //匹配lk之间o出现3次到5次之间
loook
ooooloooook
4、^ 匹配字符串开始的位置
$ 匹配字符串结束的位置
^$ 匹配空行
再定义一个原始数据
powershell
复制代码
[root@stw ~]# vim b.txt
[root@stw ~]# cat b.txt
aa
abd
cdd
cdc
cdd
powershell
复制代码
[root@stw ~]# grep "^c" b.txt
cdd
cdc
cdd
[root@stw ~]# grep "d$" b.txt
abd
cdd
cdd
[root@stw ~]# grep "^$" b.txt
5、[list] 匹配list列表中的一个字符
[^list]
匹配任意非list列表中的一个字符
定义一个原始数据
powershell
复制代码
[root@stw ~]# vim c.txt
[root@stw ~]# cat c.txt
lok
lo12k
lo1k
loAk
loBk
look
loak
lodk
abcd
1234
powershell
复制代码
[root@stw ~]# grep "lo[a-zA-Z0-9]k" c.txt //lo k,空格的位置是任意一个字母或者数字
lo1k
loAk
loBk
look
loak
lodk
[root@stw ~]# grep "lo[ABo]k" c.txt //lo k,空格的位置只能是A、B或者o
loAk
loBk
look
[root@stw ~]# grep "lo[^a-zA-Z]k" c.txt //lo k,空格的位置不能是字母
lo1k
[root@stw ~]# grep "[^a-zA-Z]" c.txt //不能是纯字母
lo12k
lo1k
1234
三、扩展正则
以下是正则表达式中这些元字符及其说明的表格形式:
元字符 |
含义说明 |
示例 |
+ |
匹配前面一个字符1次或多次 |
lo+k (匹配至少一个o,如lok、look、loook等) |
? |
匹配前面一个字符0次或1次 |
lo?k (匹配0个或1个o,如lk、lok) |
() |
将括号中的字符串作为一个整体(分组) |
l(oo)+k (将"oo"作为整体匹配1次或多次,如look、looook等) |
` |
` |
以"或"的方式匹配字符串 |
{} |
为可重复的正则表达式指定重复次数(间隔) |
{n} :重复n次,如lo{2}k (匹配look) {n,} :重复n次或更多次,如lo{2,}k (匹配look、loook等) {n,m} :重复n到m次,如lo{2,3}k (匹配look、loook) |
查看原始数据
powershell
复制代码
[root@stw ~]# cat a.txt
lk
lok
look
loook
looooook
loooooaaak
looooooook
abbbbcd
abbbbcd666
ooooloooook
oooooolk
aoblck
1、+ 匹配前面一个字符1次及以上
powershell
复制代码
[root@stw ~]# egrep "lo+k" a.txt
lok
look
loook
looooook
looooooook
ooooloooook
2、 ? 匹配前面一个字符0次或者1次
powershell
复制代码
[root@stw ~]# egrep "lo?k" a.txt
lk
lok
oooooolk
3、() 将括号中的字符串作为一个整体
powershell
复制代码
[root@stw ~]# egrep "l(oo)+k" a.txt //lk之间的o必须是两个的倍数
look
looooook
looooooook
4、| 以或的方式匹配字条串
powershell
复制代码
[root@stw ~]# echo labk >> a.txt
[root@stw ~]# cat a.txt
lk
lok
look
loook
looooook
loooooaaak
looooooook
abbbbcd
abbbbcd666
ooooloooook
oooooolk
aoblck
labk
[root@stw ~]# egrep "l(oo|ab)+k" a.txt //lk之间匹配oo或者ab字符,并且出现一次或者多次
look
looooook
looooooook
labk
5、{} 允许为可重复的正则表达式指定一个上限
{n} 重复n次;{n,} 重复n次或更多次;{n,m} 重复n到m次
powershell
复制代码
[root@stw ~]# egrep "lo{3}k" a.txt //lk之间o出现3次
loook
[root@stw ~]# egrep "lo{3,}k" a.txt //lk之间o出现3次及以上
loook
looooook
looooooook
ooooloooook
[root@stw ~]# egrep "lo{3,5}k" a.txt //lk之间o出现3次到5次之间
loook
ooooloooook
四、特殊的字符组
以下是正则表达式中字符类(POSIX 字符类)的表格说明:
字符类 |
描述 |
[[:alpha:]] |
匹配任意字母字符(包括大写字母 A-Z 和小写字母 a-z) |
[[:alnum:]] |
匹配任意字母数字字符(0-9 数字、A-Z 大写字母或 a-z 小写字母) |
[[:blank:]] |
匹配空白字符中的空格(space)或制表符(Tab) |
[[:digit:]] |
匹配 0-9 之间的任意数字字符 |
[[:lower:]] |
仅匹配小写字母字符(a-z) |
[[:print:]] |
匹配任意可打印字符(包括字母、数字、标点符号和空格等可见字符) |
[[:punct:]] |
匹配任意标点符号(如 !"#$%&'()*+,-./:;<=>?@[]^_`{ |
[[:space:]] |
匹配任意空白字符(包括空格、Tab、换行符 NL、换页符 FF、垂直制表符 VT 和回车符 CR) |
[[:upper:]] |
仅匹配大写字母字符(A-Z) |