正则表达式

正则表达式

一、基础的正则表达式

基础正则常见元字符(支付的工具: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)
相关推荐
草履虫建模15 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq17 小时前
分布式系统安全通信
开发语言·c++·算法
天才奇男子17 小时前
HAProxy高级功能全解析
linux·运维·服务器·微服务·云原生
小李独爱秋18 小时前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
学嵌入式的小杨同学18 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux
Re.不晚18 小时前
Java入门17——异常
java·开发语言
酥暮沐18 小时前
iscsi部署网络存储
linux·网络·存储·iscsi
精彩极了吧18 小时前
C语言基本语法-自定义类型:结构体&联合体&枚举
c语言·开发语言·枚举·结构体·内存对齐·位段·联合
❀͜͡傀儡师18 小时前
centos 7部署dns服务器
linux·服务器·centos·dns
Dying.Light19 小时前
Linux部署问题
linux·运维·服务器