文章目录

  • 前言
  • 一、正则表达式概述
    • 1.1 定义
    • 1.2 主要用途
    • 1.3 Linux 中的正则表达式分类
      • 1.3.1 基础正则表达式(BRE)
      • 1.3.2 扩展正则表达式(ERE)
  • 二、正则表达式的基本组成
    • 2.1 普通字符
    • 2.2 元字符
      • 2.2.1 基本元字符
      • 2.2.2 重复次数相关
      • 2.2.3 扩展正则中的元字符(ERE)
      • 2.2.4 `egrep`的用法
  • 三、grep 工具的使用
    • 3.1 常用选项
    • 3.2 使用示例
  • 四、正则表达式操作案例
    • 4.1 查找特定字符
    • 4.2 使用中括号集合
    • 4.3 使用定位符
    • 4.4 使用点与星号
    • 4.5 使用次数限定符
  • 五、基础正则与扩展正则对比表
  • 总结
    • 🎯 核心价值
    • 📊 体系结构
    • ⚡ 四大核心能力
    • 🛠️ 实战应用


前言

你是否曾在成百上千行的日志文件中寻找某个关键错误信息,却像大海捞针一样无从下手?是否曾需要从杂乱的文本中快速提取电话号码、邮箱地址或特定格式的数据,却不得不手动逐行筛选?别担心,正则表达式正是为你解决这些问题而生的“文本处理瑞士军刀”。它就像是一套神奇的密码,掌握了它,你就能让计算机自动理解你想要的文本模式,无论是筛选日志、解析数据还是批量处理文档,都将变得轻松高效。本章将带你从零开始,解锁这项让无数程序员和系统管理员受益终身的强大技能。


一、正则表达式概述

1.1 定义

正则表达式(Regular Expression,常缩写为 regex/regexp/RE)是一种用于描述字符串模式的规则。它能够高效地进行检索替换过滤符合特定规则的字符串。

1.2 主要用途

  • 系统日志筛选(如定位“登录失败”“服务启动失败”等关键信息)
  • 配置文件解析与提取
  • 文本查找与替换
  • 脚本编程中的条件匹配与验证

1.3 Linux 中的正则表达式分类

类型名称特点需转义字符常用工具
BRE基础正则表达式功能有限,传统语法\{n\}, \+, \?, \(\), |grep, sed
ERE扩展正则表达式功能强大,语法简洁无需转义grep -E, egrep, awk

1.3.1 基础正则表达式(BRE)

  • 语法较为传统,功能相对有限
  • 量词如 {} 需转义为 \{n,m\}
  • +?() 等符号也需要转义
  • 常用工具:grepsed

1.3.2 扩展正则表达式(ERE)

  • 功能更强大,语法更简洁
  • +?(){}| 等符号无需转义
  • 常用工具:egrep(或 grep -E)、awk

二、正则表达式的基本组成

2.1 普通字符

包括字母、数字、标点符号等,匹配其本身。

2.2 元字符

2.2.1 基本元字符

  • .:匹配任意单个字符(除换行符 \r\n
  • []:匹配字符集合中的一个字符,如 [abc][a-z][0-9A-Z]
  • [^]:匹配不在集合中的任意一个字符,如 [^a-z] 表示非小写字母
  • ^:匹配行首
  • $:匹配行尾
  • \:转义符,用于取消元字符的特殊含义

2.2.2 重复次数相关

  • *:匹配前一个字符 0 次或多次
  • \+:匹配前一个字符至少 1 次(BRE 中需转义)
  • \{n\}:匹配前一个字符恰好 n 次
  • \{n,m\}:匹配前一个字符 n 到 m 次
  • \{n,\}:匹配前一个字符至少 n 次

2.2.3 扩展正则中的元字符(ERE)

  • +:匹配前一个字符至少 1 次(无需转义)
  • ?:匹配前一个字符 0 次或 1 次
  • |:表示“或”关系,匹配多个模式之一
  • ():用于分组,可对一组字符进行重复或选择
  • ()+:匹配重复的组

2.2.4 egrep的用法

egrep 是 Unix/Linux 系统中的一个文本搜索工具,属于 GNU grep 的扩展版本(grep -E 的别名)。它支持扩展正则表达式(Extended Regular Expressions, ERE),比基础正则表达式(BRE)提供更灵活的语法,例如直接使用 +、?、| 等元字符而无需转义。
基本量词语法

  • egrepawk使用{n}{n,}{n,m}进行匹配时,{}前无需加转义符\
  • 示例:
    egrep -E -n 'wo{2}d' demo    # 匹配"wood"
    egrep -E -n 'wo{2,3}d' demo  # 匹配"wood"或"woood"
    

常用量词操作符

  • + 重复一个或多个前导字符

    • 示例:egrep -n 'wo+d' demo 匹配"wood"、“woood”、"woooooood"等字符串
  • ? 零个或一个前导字符

    • 示例:egrep -n 'bes?t' demo 匹配"bet"和"best"
  • | 或操作(匹配多个模式)

    • 示例:egrep -n 'of|is|on' demo 匹配"of"、“if"或"on”
  • () 分组匹配

    • 示例:egrep -n 't(a|e)st' demo
      匹配"tast"和"test",利用分组将共有的"t"和"st"提取,仅将差异部分"a|e"放入组内
  • ()+ 重复分组匹配

    • 示例:egrep -n 'A(xyz)+C' demo
      匹配以"A"开头、"C"结尾,中间包含一个或多个"xyz"的字符串

三、grep 工具的使用

3.1 常用选项

选项功能说明使用示例
-E启用扩展正则表达式grep -E 'wo{2}d' file
-c统计匹配行数grep -c root /etc/passwd
-i忽略大小写grep -i "the" file
-o只输出匹配内容grep -o '[0-9]\+' file
-v反向匹配(排除)grep -v root /etc/passwd
-n显示行号grep -n pattern file
--color=auto高亮显示匹配内容grep --color=auto pattern file

3.2 使用示例

grep -c root /etc/passwd          # 统计包含 root 的行数
grep -i "the" web.sh              # 忽略大小写匹配 the
grep -v root /etc/passwd          # 输出不包含 root 的行
ipconfig | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+' | head -1  # 提取 IP 地址
  • -c
    在这里插入图片描述
  • -i
    在这里插入图片描述
  • -v
    在这里插入图片描述
  • -o
    在这里插入图片描述

四、正则表达式操作案例

元字符功能说明示例匹配结果
.匹配任意单个字符(除\r\n)w..dwood, word, w00d
[ ]匹配字符集合中的任意一个字符sh[io]rtshirt, short
[^ ]匹配不在集合中的任意一个字符[^w]oofoo, boo(排除woo)
^匹配行首位置^the以the开头的行
$匹配行尾位置\.$以.结尾的行
\转义特殊字符a\.ba.b(而不是ajb等)

4.1 查找特定字符

grep -n 'the' demo        # 查找包含 the 的行
grep -vn 'the' demo       # 查找不包含 the 的行

请添加图片描述

4.2 使用中括号集合

grep -n 'sh[io]rt' demo   # 匹配 shirt 或 short
grep -n '[^w]oo' demo     # 匹配开头不是 w 且包含 oo 的行

在这里插入图片描述

4.3 使用定位符

grep -n '^the' demo       # 匹配以 the 开头的行
grep -n '\.$' demo        # 匹配以 . 结尾的行
grep -n '^$' demo         # 匹配空行

在这里插入图片描述

4.4 使用点与星号

grep -n 'w..d' demo       # 匹配 w 开头、d 结尾,中间两个任意字符
grep -n 'woo*d' demo      # 匹配 w 开头、d 结尾,中间有 0 个或多个 o
grep -n 'w.*d' demo       # 匹配 w 开头、d 结尾,中间任意多个字符
grep -n '[0-9][0-9]*' demo # 匹配任意数字

在这里插入图片描述

4.5 使用次数限定符

grep -n 'o\{2\}' demo           # 匹配两个连续的 o
grep -n 'wo\{2,5\}d' demo       # 匹配 w 开头、d 结尾,中间 2~5 个 o
grep -n 'wo\{2,\}d' demo        # 匹配 w 开头、d 结尾,中间至少 2 个 o

在这里插入图片描述


五、基础正则与扩展正则对比表

量词功能说明BRE语法ERE语法示例
*匹配0次或多次**wo*d(wd, wod, wood)
+匹配1次或多次\++wo\+d(wod, wood)
?匹配0次或1次\??bes?t(bet, best)
{n}匹配恰好n次\{n\}{n}o\{2\}(oo)
{n,}匹配至少n次\{n,\}{n,}o\{2,\}(oo, ooo, …)
{n,m}匹配n到m次\{n,m\}{n,m}o\{2,5\}(oo, ooo, oooo, ooooo)

总结

🎯 核心价值

正则表达式是文本处理的瑞士军刀,通过模式匹配实现高效检索、替换和过滤,极大提升数据处理效率。

📊 体系结构

两大体系并行:

  • BRE(基础正则):传统严谨,需转义特殊字符
  • ERE(扩展正则):现代简洁,直接使用元字符

⚡ 四大核心能力

  1. 精准定位 - 用 ^ $ 锁定行首行尾
  2. 字符控制 - 用 [ ] [^ ] 精确字符范围
  3. 数量调控 - 用 * + ? {} 控制出现次数
  4. 逻辑组合 - 用 | () 实现复杂逻辑匹配

🛠️ 实战应用

grepawksed等结合使用,可以处理99%的文档

  • 日志分析:快速定位错误信息 grep -n "error" logfile
  • 数据提取:匹配特定格式 grep -o '[0-9]\{3\}-[0-9]\{2\}-[0-9]\{4\}'
  • 文本清洗:过滤空行 grep -v '^$' file
  • 模式验证:检查格式合法性 grep -E '^[A-Za-z0-9]+@[A-Za-z0-9]+\.[a-z]{2,}$'

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

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

相关文章

Dify 集成 Milvus 配置指南

🧩 Dify 集成 Milvus 配置指南 🔧 详细配置步骤 1. 环境准备与克隆仓库 首先确保你的系统已安装 Git、Docker 和 Docker Compose。然后克隆 Dify 的代码仓库: git clone https://github.com/langgenius/dify.git cd dify/docker2. 配置环境变…

为不平,不止于此

口碑可以成就一个人,也可以毁掉一个人, 所以我们选择用实力去创造两种无声的口碑。 要么让期待的你张口而呼, 要么让挑剔的你哑口无言。玛哈特科技创始人 #为不平,不止于此#

0902 C++类的匿名对象

Part 1.梳理思维导图一.匿名对象1.概念没有对象名的类对象2.格式类名();3.作用1.给有名对象初始化2.给对象数组初始化3.作为函数的参数传递给形参4.例子#include <iostream>using namespace std;class Dog {friend void Dogfriend(Dog &b); private:string name;int …

在 PySpark 中解锁窗口函数的力量,实现高级数据转换

本篇文章Mastering PySpark Window Functions: A Practical Guide to Time-Based Analytics适合数据分析和工程师入门了解PySpark的窗口函数。文章的亮点在于详细介绍了窗口函数的基本概念及其在销售数据分析中的实际应用&#xff0c;帮助读者理解如何进行复杂的数据计算而无需…

从理念到实践:三层解耦架构与“无系统”论

在上一篇中&#xff0c;我们揭示了“五层双闭环”治理模型如何像骨骼一样&#xff0c;为数字化转型提供支撑和定型。但再宏伟的蓝图也需要坚实的施工来实现。今天&#xff0c;我们将深入最具体的实施层面&#xff0c;将“业务重塑”和“以人为本”的理念&#xff0c;转化为可落…

详细介绍Linux 内存管理struct page数据结构中的_count和_mapcount有什么区别?

在Linux内核的struct page中&#xff0c;_count&#xff08;或_refcount&#xff09;和_mapcount是两个关键的引用计数成员&#xff0c;它们各自承担不同的职责。以下是深度解析和代码案例&#xff1a;1. _count vs _mapcount 区别详解_count&#xff08;或_refcount&#xff0…

面阵 vs 线阵相机:怎么选不踩坑?选型公式直接套用

面阵vs线阵相机&#xff1a;怎么选不踩坑&#xff1f;选型公式直接套用&#x1f3af;面阵vs线阵相机怎么选不踩坑&#xff1f;&#x1f3af;一、面阵相机&#xff1a;工业检测的“万能选手”&#xff0c;拍全图靠它&#x1f3af;二、线阵相机&#xff1a;大视野/高精度的“专属…

Spring Security 如何使用@PreAuthorize注解

&#x1f9f1; 第一步&#xff1a;环境准备✅ 1. 创建数据库&#xff08;MySQL&#xff09;-- 创建数据库&#xff0c;使用 utf8mb4 字符集支持 emoji 和多语言 CREATE DATABASE security_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;-- 使用该数据库 USE security…

JVM中产生OOM(内存溢出)的8种典型情况及解决方案

Java中的OutOfMemoryError&#xff08;OOM&#xff09;是当JVM内存不足时抛出的错误。本文将全面剖析JVM中产生OOM的各种情况&#xff0c;包括堆内存溢出、方法区溢出、栈溢出等&#xff0c;并提供详细的诊断方法和解决方案。 一、OOM基础概念 1.1 OOM错误类型 Java中的OOM是…

【IEEE出版、EI检索、往届会后3个月检索】第四届信号处理、计算机网络与通信国际学术会议(SPCNC 2025)

第四届信号处理、计算机网络与通信国际学术会议&#xff08;SPCNC 2025&#xff09;将于2025年12月5-7日于中国武汉召开&#xff08;线上同步&#xff09;。为本次会议旨在齐聚海内外信号处理、计算机网络与通信等计算机领域的专家学者&#xff0c;为相关领域研究和从业人员提供…

Spring boot注解介绍

1. Spring 核心注解Spring Boot 是基于 Spring 框架的&#xff0c;所以核心注解依然适用。✅ 常见核心注解Component表示一个通用组件&#xff0c;Spring 会自动扫描并注入到容器中。Component public class MyComponent {public void sayHello() {System.out.println("He…

撤销回退 情况⼆:已经 add ,但没有 commit

撤销回退 情况⼆&#xff1a;已经 add &#xff0c;但没有 commit add 后还是保存到了暂存区呢&#xff1f;怎么撤销呢&#xff1f; 1 # 向ReadMe中新增⼀⾏代码 2 hyb139-159-150-152:~/gitcode$ vim ReadMe 3 hyb139-159-150-152:~/gitcode$ cat ReadMe 4 hello bit 5 hell…

【Linux笔记】命令行与vim基础

一、Linux命令行基础 1. 基本语法命令空格参数&#xff08;可写可不写&#xff09;空格文件&#xff0c;文件夹&#xff08;可写可不写&#xff09;ls列出文件夹中的内容/opt 根目录下的opt文件夹ls-a all显示出所有文件以及隐藏文件/optls-a如果不写则输出一个点&#xff0c;当…

Redis 的整数集合:像分类收纳盒一样的整数专属存储

目录 一、先懂定位&#xff1a;为什么需要整数集合&#xff1f;&#xff08;衔接哈希表&#xff09; 二、整数集合的结构&#xff1a;像 “贴了规格标签的收纳盒” 1. encoding&#xff1a;收纳盒的 “规格标签”&#xff08;核心&#xff1a;决定格子大小&#xff09; 2. …

Linux 进程状态 — 僵尸进程

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录进…

React 中 key 的作用

React 中 key 的作用是什么&#xff1f; Date: August 31, 2025 Area: 原理key 概念 在 React 中&#xff0c;key 用于识别哪些元素是变化、添加或删除的。 在列表渲染中&#xff0c;key 尤其重要&#xff0c;因为它能提高渲染性能和确保组件状态的一致性。key 的作用 1&#x…

wpf之附加属性

前言 附加属性是 WPF 中一个非常强大和独特的概念。简单来说&#xff0c;它允许一个对象为另一个在其本身类定义中未定义的属性赋值。 1、定义附加属性 定义一个Watermark的附加属性&#xff0c;该属性的作用是将TextBox的附加属性改变时&#xff0c;TextBox的字体颜色改成灰…

深入浅出 RabbitMQ-消息可靠性投递

大家好&#xff0c;我是工藤学编程 &#x1f989;一个正在努力学习的小博主&#xff0c;期待你的关注实战代码系列最新文章&#x1f609;C实现图书管理系统&#xff08;Qt C GUI界面版&#xff09;SpringBoot实战系列&#x1f437;【SpringBoot实战系列】SpringBoot3.X 整合 Mi…

数字化时代,中小企业如何落地数字化转型

大数据时代&#xff0c;各行各业的行业龙头和大型集团都已经开始了数据管理&#xff0c;让数据成为数据资产。但是在我国&#xff0c;中小企业的数量巨大&#xff0c;很多管理者忽视了这一点&#xff0c;今天我们就来聊一聊中小企业的数字化转型。中小企业需要数字化转型首先要…

Unity笔记(九)——画线功能Linerenderer、范围检测、射线检测

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。这里只记录代码知识。十一、画线功能Linerenderer画线功能Linerenderer是Unity提供的画线脚本&#xff0c;创建一个空…