Linux 正则表达式详解(基础 + 扩展 + 实操)

Linux 正则表达式详解(基础 + 扩展 + 实操)

正则表达式(Regular Expression,简称 RE)是 Linux 文本处理的核心工具,用于定义字符匹配模式,配合 grepsedawk 等工具可实现文本过滤、查找、替换等操作。本文将从概念、基础正则、扩展正则、特殊字符组四个维度,结合实操案例完整讲解

一、正则表达式概述

1. 核心概念

正则表达式是模式模板,Linux 工具通过该模板对数据流进行 “匹配筛选”:

  • 匹配的数据:被工具接受并进一步处理(如输出、替换)
  • 不匹配的数据:被直接滤除

本质:通过 “普通字符 + 元字符” 的组合,描述字符串的排列规则,实现对文本的分割、匹配、查找、替换

2. 构成与作用

构成部分说明示例
普通字符无特殊含义的字符(字母、数字、标点)a1!-
元字符具有特殊匹配规则的专用字符^$*[ ]

核心作用:判断字符串是否符合指定格式(如 “是否为手机号”“是否为邮箱”),或从文本中提取特定格式的内容(如 “提取所有 IP 地址”)

3. 可实现的核心目标

  1. 匹配验证:判断字符串是否符合正则模式(如 “验证一行文本是否以 # 开头”)
  2. 内容提取:从复杂文本中筛选出符合模式的部分(如 “从日志中提取所有错误代码”)

二、基础正则(Basic Regular Expression,BRE)

基础正则是正则的 “核心子集”,支持 grepsed(基础模式)、awk 等工具,核心是掌握元字符的匹配规则

1. 基础正则核心元字符表

元字符功能描述示例匹配效果
\转义字符:将特殊字符还原为普通字符\$\!\n匹配 $!、换行符
^匹配 “字符串开头” 的位置^a^#匹配以 a 开头、以 # 开头的行
$匹配 “字符串结尾” 的位置word$3$匹配以 word 结尾、以 3 结尾的行
^$匹配 “空行”(开头到结尾无任何字符)grep "^$" file.txt筛选文件中的所有空行
.匹配 “除换行符(\n)外的任意 1 个字符”lo.kl..kloak(1 个字符)、look(2 个字符)
*匹配 “前面 1 个字符出现 0 次或多次”lo*klk(o 出现 0 次)、lok(o1 次)、look(o2 次)
[list]匹配 “list 列表中的任意 1 个字符”go[ola]d[a-z0-9]gold/goal/god、任意小写字母或数字
[^list]匹配 “非 list 列表中的任意 1 个字符”[^0-9][^a-z]非数字、非小写字母
\{n\}匹配 “前面 1 个字符出现恰好 n 次lo\{2\}k[0-9]\{2\}look(o2 次)、任意 2 位数字
\{n,\}匹配 “前面 1 个字符出现至少 n 次lo\{2,\}k[0-9]\{3,\}look(o2 次)、loook(o3 次)、3 位及以上数字
\{n,m\}匹配 “前面 1 个字符出现n~m 次lo\{2,3\}klook(o2 次)、loook(o3 次)

注意:基础正则中,{n}/{n,}/{n,m} 必须加转义符 \,否则会被当作普通字符处理

2. 基础正则实操案例

以下案例基于测试文件 a.txt/b.txt/c.txt,先定义测试文件内容:

[root@syf ~]# vim a.txt
lk
lok
look
loook
looooook
loooooaaak
looooooook
abbbbcd
abbbbcd666
ooooloooook
oooooolk
aoblck
~ 
[root@syf ~]# vim b.txt
aaabd
cdd
cdc
cdd
~ 
[root@syf ~]# vim c.txt
lok
lo12k
lo1k
loAk
loBk
look
loak
lodk
abcd
1234
~   
案例 1:* 匹配 “前面字符 0 次或多次”
# 匹配 "lo*k":o出现0次(lk)、1次(lok)、多次(look等)
[root@syf ~]# grep "lo*k" a.txt
lk          # o出现0次
lok         # o出现1次
look        # o出现2次
loook       # o出现3次
looooook    # o出现5次
looooooook  # o出现7次
ooooloooook # 中间含多个o
oooooolk    # o出现6次# 匹配 "loo*k":o至少出现1次(排除lk)
[root@syf ~]# grep "loo*k" a.txt
lok         # o出现1次
look        # o出现2次
loook       # o出现3次
looooook    # o出现5次
looooooook  # o出现7次
ooooloooook # 中间含多个o
案例 2:. 匹配 “任意 1 个字符”
# 匹配 "lo.*k":o后接“任意字符(0次或多次)”+k(.*表示任意字符任意次)
[root@syf ~]# grep "lo.*k" a.txt
lok                 # o后接0个字符
look                # o后接1个o
loook               # o后接2个o
looooook            # o后接4个o
loooooaaak          # o后接3个o+2个a
looooooook          # o后接5个o
ooooloooook         # 前面有o,中间含多个o# 匹配 "lo.k":o后接“恰好1个字符”+k
[root@syf ~]# grep "lo.k" a.txt
look                # o后接1个o(lo+o+k)# 匹配 "l..k":l后接“恰好2个字符”+k
[root@syf ~]# grep "l..k" a.txt
look                # l后接2个o(l+oo+k)
案例 3:\{n\}/\{n,\}/\{n,m\} 匹配 “固定次数”
# 匹配 "lo\{2\}k":o恰好出现2次
[root@syf ~]# grep "lo\{2\}k" a.txt
look                # o出现2次# 匹配 "lo\{3\}k":o恰好出现3次
[root@syf ~]# grep "lo\{3\}k" a.txt
loook               # o出现3次# 匹配 "lo\{3,\}k":o至少出现3次
[root@syf ~]# grep "lo\{3,\}k" a.txt
loook               # o出现3次
looooook            # o出现5次
looooooook          # o出现7次
ooooloooook         # 中间o出现5次# 匹配 "lo\{3,5\}k":o出现3~5次
[root@syf ~]# grep "lo\{3,5\}k" a.txt
loook               # o出现3次
ooooloooook         # 中间o出现5次(符合3~5次)
案例 4:^/$/^$ 匹配 “开头 / 结尾 / 空行”
# 匹配 "^c":以c开头的行
[root@syf ~]# grep "^c" b.txt
cdd
cdc
cdd# 匹配 "d$":以d结尾的行
[root@syf ~]# grep "d$" b.txt
abd
cdd
cdd# 匹配 "^$":空行(输出为空行,对应b.txt中的空行)
[root@syf ~]# grep "^$" b.txt
(此处输出1行空行)
案例 5:[list]/[^list] 匹配 “指定 / 非指定字符”
# 匹配 "lo[a-zA-Z0-9]k":o后接1个“字母/数字”+k
[root@syf ~]# grep "lo[a-zA-Z0-9]k" c.txt
lo1k        # o后接数字1
loAk        # o后接大写A
loBk        # o后接大写B
look        # o后接小写o
loak        # o后接小写a
lodk        # o后接小写d# 匹配 "lo[ABo]k":o后接A/B/o中的任意1个
[root@syf ~]# grep "lo[ABo]k" c.txt
loAk        # A
loBk        # B
look        # o# 匹配 "lo[^a-zA-Z]k":o后接“非字母”(即数字/符号)
[root@syf ~]# grep "lo[^a-zA-Z]k" c.txt
lo1k        # 非字母(数字1)# 匹配 "[^a-zA-Z]":包含“非字母”的行(数字/符号)
[root@syf ~]# grep "[^a-zA-Z]" c.txt
lo12k       # 含数字1、2
lo1k        # 含数字1
1234        # 全是数字

三、扩展正则(Extended Regular Expression,ERE)

扩展正则是基础正则的 “增强版”,新增了 +?()| 等元字符,且 {n}/{n,}/{n,m} 无需转义。支持工具:egrepgrep -E)、awksed -r(扩展模式)

1. 扩展正则核心元字符表

元字符功能描述示例匹配效果
+匹配 “前面 1 个字符出现 1 次或多次”(比*严格)lo+k匹配 lok(1 次)、look(2 次),不匹配 lk
?匹配 “前面 1 个字符出现 0 次或 1 次”(最多 1 次)lo?k仅匹配 lk(0 次)、lok(1 次)
()将括号内的字符视为 “1 个整体”(分组)l(oo)+k匹配 look(oo1 次)、looook(oo2 次)
``逻辑 “或”:匹配多个模式中的任意 1 个`l(ooab)k`匹配 look(oo)、labk(ab)
{n}同基础正则 \{n\},无需转义lo{2}k匹配 look(o2 次)
{n,}同基础正则 \{n,\},无需转义lo{3,}k匹配 loook(o3 次)及以上
{n,m}同基础正则 \{n,m\},无需转义lo{3,5}k匹配 loook(o3 次)~looooook(o5 次)

2. 扩展正则实操案例(基于 a.txt

案例 1:+ 匹配 “前面字符 1 次及以上”
# 匹配 "lo+k":o至少1次(排除lk)
[root@syf ~]# egrep "lo+k" a.txt
lok         # o1次
look        # o2次
loook       # o3次
looooook    # o5次
looooooook  # o7次
ooooloooook # 中间o5次
案例 2:? 匹配 “前面字符 0 次或 1 次”
# 匹配 "lo?k":o最多1次(仅lk、lok)
[root@syf ~]# egrep "lo?k" a.txt
lk          # o0次
lok         # o1次
oooooolk    # 前面o6次,最后o0次(符合lo?k)
案例 3:() 分组匹配 “整体重复”
# 匹配 "l(oo)+k":将"oo"视为整体,至少重复1次
look        # "oo"重复1次(l+oo+k)
looooook    # "oo"重复2次(l+oo+oo+k)
looooooook  # "oo"重复3次(l+oo+oo+oo+k)
案例 4:| 逻辑 “或” 匹配多模式
# 先添加测试行 "labk" 到 a.txt
[root@syf ~]# echo "labk" >> a.txt# 匹配 "l(oo|ab)k":匹配 "loo k" 或 "lab k"
[root@syf ~]# egrep "l(oo|ab)+k" a.txt
look        # 匹配 "oo"
looooook    # 匹配 "oo"(重复2次)
looooooook  # 匹配 "oo"(重复3次)
labk        # 匹配 "ab"
案例 5:{n}/{n,}/{n,m} 无需转义
# 匹配 "lo{3}k":o恰好3次(无需转义{3})
[root@syf ~]# egrep "lo{3}k" a.txt
loook       # o3次# 匹配 "lo{3,}k":o至少3次
[root@syf ~]# egrep "lo{3,}k" a.txt
loook               # o3次
looooook            # o5次
looooooook          # o7次
ooooloooook         # 中间o5次# 匹配 "lo{3,5}k":o3~5次
[root@syf ~]# egrep "lo{3,5}k" a.txt
loook               # o3次
ooooloooook         # 中间o5次

四、特殊字符组(字符类)

为简化正则书写,Linux 提供了预定义字符组(又称 “字符类”),等价于基础正则中的某些字符集合,更易记忆和跨平台(避免不同编码的字符范围问题)

特殊字符组表

字符组等价写法描述应用场景
[[:alpha:]][a-zA-Z]匹配任意字母(大写 + 小写)提取纯字母内容
[[:alnum:]][a-zA-Z0-9]匹配任意字母或数字提取账号、ID(仅字母数字)
[[:blank:]][ \t]匹配空格或 Tab 键查找含空格 / Tab 的行
[[:digit:]][0-9]匹配任意数字(0~9)提取手机号、IP 地址中的数字部分
[[:lower:]][a-z]匹配任意小写字母转换为大写前的筛选
[[:upper:]][A-Z]匹配任意大写字母转换为小写前的筛选
[[:print:]]-匹配任意可打印字符(含空格、标点)排除不可见字符(如控制字符)
[[:punct:]][!\"#$%&...]匹配任意标点符号提取含标点的句子
[[:space:]][ \t\n\r...]匹配任意空白字符(空格、Tab、换行等)查找含空白字符的行

实操示例

# 1. 匹配含数字的行([[:digit:]] 等价于 [0-9])
[root@syf ~]# grep "[[:digit:]]" c.txt
lo12k
lo1k
1234# 2. 匹配纯字母的行([[:alpha:]]+ 表示“字母出现1次及以上”)
[root@syf ~]# egrep "^[[:alpha:]]+$" c.txt
lok
loAk
loBk
look
loak
lodk
abcd# 3. 匹配含标点的行([[:punct:]])
[root@syf ~]# echo 'Hello,World!' > d.txt
[root@syf ~]# grep "[[:punct:]]" d.txt
Hello, World!  # 含逗号和感叹号

核心知识点总结

  1. 基础正则 vs 扩展正则
    • 基础正则:{n}/{n,}/{n,m} 需转义(\{n\}),无 +/?/()/|
    • 扩展正则:{n} 无需转义,支持 +/?/()/|,工具用 egrep/sed -r/awk
  2. 元字符优先级
    • 分组 () > 次数 */+/?/{n} > 位置 ^/$ > 逻辑 |
  3. 特殊字符组:优先使用 [[:digit:]] 而非 [0-9],跨平台更稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922119.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Json-rpc通信项目(基于C++ Jsoncpp muduo库)

一、介绍RPC RPC(Remote Procedure Call)远程过程调用,一种通过网络从远程计算器上请求服务,而不需要了解底层网络通信细节,RPC可以使用多种网络协议进行通信,并且在TCP/IP网络四层模型中跨越了传输层和应…

RL【9】:Policy Gradient

系列文章目录 Fundamental Tools RL【1】:Basic Concepts RL【2】:Bellman Equation RL【3】:Bellman Optimality Equation Algorithm RL【4】:Value Iteration and Policy Iteration RL【5】:Monte Carlo Learnin…

Redis是什么?一篇讲透它的定位、特点与应用场景

Redis是什么?一篇讲透它的定位、特点与应用场景 1. Redis的定义与核心概念 1.1 什么是Redis? Redis(Remote Dictionary Server) 是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。Redis由…

一款免费开源轻量的漏洞情报系统 | 漏洞情报包含:组件漏洞 + 软件漏洞 + 系统漏洞

工具介绍 bug_search一款免费开源轻量的漏洞情报系统 基于python3 Amis2.9 开发,仅依赖Flask,requests,无需数据库,Amis是百度开源的低代码前端框架漏洞情报包含:组件漏洞 软件漏洞 系统漏洞 增加邮件发送消息报警功能增加钉钉…

详解在Windows系统中生成ssl证书,实现nginx配置https的方法

目录一、下载安装OpenSSL二、证书生成三、修改nginx配置总结Nginx 是一个高性能的HTTP和反向代理web服务器,在进行web项目开发时,大多都是使用nginx对外提供web服务。HTTPS (全称:Hypertext Transfer Protocol Secure [5]&#xf…

AI视觉算法中的OpenCV API (二)

视频写入 (FourCC, VideoWriter)​ 1. VideoWriter_fourcc - 视频编码器四字符代码 # OpenCV 3.x, 4.x fourcc cv2.VideoWriter_fourcc(M,J,P,G)fourcc cv2.VideoWriter_fourcc(*H264)fourcc cv2.VideoWriter_fourcc(*MJPG) ​FourCC​: 代表 ​Four ​Charac…

分享| 2025年版AIGC数字人实验室解决方案教学资源解析

AIGC数字人实验室解决方案构建了涵盖基础层、平台环境层与资源层的多层次教学架构,依托150平方米的实体空间与60人并行授课的规模化支持,为学生提供了技术实践与创新的高效平台。其教学资源体系覆盖AIGC文本生成、图像生成、数字人应用与智能体开发四大核…

内存大(巨)页

一、大(巨)页 大(巨)页,很好理解,就是的大的页。说这个大页前,得先把计算机中内存的管理简单说明一下,否则可能对于一些新手或者把操作系统中内存管理的方法的开发者不太友好。最早的…

langgraph astream使用详解

langgraph中graph的astream(stream)方法分别实现异步(同步)流式应答,在langgraph-api服务也是核心方法,实现与前端的对接,必须要把这个方法弄明白。该方法中最重要的参数是stream_mode&#xff…

【C++】模板进阶:非类型参数、模板特化与分离编译

目录 1. 非类型模板参数 2. 模板的特化 3. 分离编译 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板…

栈-1047.删除字符串中的所有相邻重复项-力扣(LeetCode)

一、题目解析 1、反复执行重复项删除操作 2、s仅由小写英文字母组成 二、算法原理 该题并不难,难的是能不能想到用栈这个数据结构解题 解法:栈模拟 横着看起来不好理解,我们把它竖起来,是不是和消消乐很类似,两两消…

【每日算法】移除元素 LeetCode

双指针方法是解决数组或链表问题中非常高效的技巧之一,尤其适用于原地修改数组或减少时间复杂度的场景。以下是对双指针方法的详细讲解。1. 双指针方法的核心思想双指针方法通常使用两个指针(或索引)在数组或链表中协同工作,通过一…

Android 项目:画图白板APP开发(六)——分页展示

本篇将介绍如何为我们的画板应用添加分页展示功能,让用户可以创建多个画布并在它们之间轻松切换。这章没有啥知识点的讲解,主要介绍一下每页保存的数据结构是什么样的。 一、ListView 多页数据的管理我们使用ListView。之前有文章讲过ListView这里就不多…

智能眼镜产品成熟度分析框架与评估

引言 当前(2025年9月12日),智能眼镜(Smart Glasses)市场正处于快速演进阶段,从早期的新奇设备向主流消费电子转型。AI整合、AR显示和多模态交互的进步推动了这一转变。根据最新数据,2025年AI眼镜发货量预计达686万台,同比增长265%,全球市场规模从2024年的约19.3亿美元…

(网络编程)网络编程套接字 UDP的socket API 代码解析

网络编程基础 为什么需要网络编程?--丰富的网络资源 用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。与本地打开视频文件类似,只是视频文件这个资源的来源是网络。 相比本地资源来说,网络提供了更为丰富的网络资源:所谓的网络资源…

【STM32】状态机(State Machine)

这篇博客介绍 状态机(State Machine),适合用于嵌入式开发、驱动开发、协议解析、按键识别等多种场景。 一、什么是状态机(State Machine)? 状态机(State Machine)是一种用于描述系统…

深度学习在离岗检测中的应用

离岗检测技术正逐步成为现代企业精细化管理和安全生产的重要工具。这项基于计算机视觉和人工智能的应用,通过自动化、实时化的监测方式,有效提升了工作纪律性和运营效率,为项目管理者和企业提供了创新的监管解决方案。在许多工作场景中&#…

Spring缓存(二):解决缓存雪崩、击穿、穿透问题

1. 缓存穿透问题与解决方案 1.1 什么是缓存穿透 缓存穿透是指查询一个不存在的数据,由于缓存中没有这个数据,每次请求都会直接打到数据库。 如果有恶意用户不断请求不存在的数据,就会给数据库带来巨大压力。 这种情况下,缓存失去了…

PHP 与 WebAssembly 的 “天然隔阂”

WebAssembly(简称 WASM)是一种低级二进制指令格式,旨在为高级语言提供高性能的编译目标,尤其在浏览器环境中实现接近原生的执行效率。它主要用于前端性能密集型场景(如游戏引擎、视频编解码、3D 渲染等)&am…

unity中通过拖拽,自定义scroll view中子物体顺序

1.在每个content的子物体上挂载DragHandler脚本,并且添加Canvs Group组件,设置见图2.DragHandler脚本内容:using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic; using System.Coll…