当前位置: 首页 > news >正文

Linux正则表达式

Linux正则表达式

一、 核心概念

正则表达式是一个由普通字符(如字母、数字)和元字符(特殊符号)组成的 pattern (模式),用于描述、匹配一系列符合某种语法规则的字符串。

  • 普通字符:没有特殊含义的字符,如 a, 1, @
  • 元字符:具有特殊功能的字符,如 ., *, ^, $
  • 工具支持grep, sed, awk, vim, less 等工具及 Perl, Python 等编程语言都支持正则表达式。
  • 两种风格
    • 基本正则表达式 (BRE):元字符需转义,功能较少。
    • 扩展正则表达式 (ERE):使用 grep -Eegrep,支持更多元字符(如 +, ?, |, ()),无需转义,更强大直观。

示例文件 words 内容:

cat
category
acat
concatenate
dog
cbt
c1t
cCt
c-t
c.t
hello cat
dg
doog
dooog
doooog
dogdog
dogdogdog
dogdogdogdog

二、 匹配单个字符

模式描述示例(grep 命令)匹配结果(来自 words
cat匹配普通字符本身grep 'cat'cat, category, acat, concatenate
[abc]字符集:匹配 [ ] 内任意一个字符grep 'c[ab]t'cat, cbt
[a-z]范围:匹配任意小写字母 [0-9] (数字), [A-Z] (大写字母)grep 'c[a-z]t' grep 'c[0-9]t'cat, cbt c1t
[^abc]取反:匹配不在 [ ] 内的任意一个字符 注意^ 必须在最前面grep 'c[^ab]t'c1t, cCt, c-t (不匹配 cat, cbt)
.匹配任意一个字符(除换行符)grep 'c.t'cat, cbt, c1t, cCt, c-t
\.转义:将元字符(如 .) 变为普通字符grep 'c\.t'c.t
\1. 转义元字符 2. 引入特殊序列(见下文)grep 'c\.t' grep '\s'c.t 匹配空格、制表符等

三、 匹配特殊字符(预定义字符集)

模式描述等价于
[[:digit:]]数字[0-9]
[[:alpha:]]字母[A-Za-z]
[[:alnum:]]字母或数字[A-Za-z0-9]
[[:space:]]空白字符(空格、制表符、换行符等)[ \t\n\r\f\v]
[[:punct:]]标点符号
\s匹配任何空白字符 (grep 支持)[[:space:]]
\S匹配任何非空白字符[^[:space:]]
\w匹配字母、数字、下划线 (grep 支持)[A-Za-z0-9_]
\W匹配任何非字母、数字、下划线[^A-Za-z0-9_]
\n匹配换行符

四、 匹配位置(锚点)

模式描述示例(grep 命令)匹配结果(来自 words
^匹配行首grep '^cat'cat, category
$匹配行尾grep 'cat$'cat, acat
^cat$精确匹配整行就是 catgrep '^cat$'cat
\b匹配单词边界 (单词的开头或结尾)grep '\bcat' grep 'cat\b' grep '\bcat\b'cat, category cat, acat cat
\B匹配非单词边界grep '\Bcat'acat, concatenate (不在单词开头)
\< \>vim 等工具中的单词边界(左/右)grep '\<cat'\bcat

五、 匹配次数(量词)

⭐量词在扩展正则表达式 (ERE) 中更易用,需使用 grep -Eegrep

模式描述示例(egrep 命令)匹配结果(来自 words
*匹配前一个字符0次或多次(任意次)grep 'do*g' (BRE 也可用)dg, dog, doog
+(ERE) 匹配前一个字符1次或多次egrep 'do+g'dog, doog
?(ERE) 匹配前一个字符0次或1次(可选)egrep 'do?g'dg, dog
{n}(ERE) 匹配前一个字符恰好 n 次egrep 'do{2}g'doog
{m,n}(ERE) 匹配前一个字符m 到 n 次egrep 'do{2,3}g'doog, dooog
{m,}(ERE) 匹配前一个字符至少 m 次egrep 'do{2,}g'doog, dooog, doooog
{,n}(ERE) 匹配前一个字符最多 n 次egrep 'do{,3}g'dg, dog, doog, dooog

六、 分组与反向引用

1. 分组 ( )
  • (ERE) 将多个字符作为一个整体,配合量词使用。

  • # 匹配连续出现2到3次的 "dog"
    [laoma@shell ~]$ egrep '(dog){2,3}' words
    dogdog
    dogdogdog # 匹配 (dog){3}
    dogdogdogdog # 匹配 (dog){4} (因为包含了{3}的情况)
    
2. 反向引用 \N
  • (ERE) 引用前面第N个分组( )匹配到的具体文本

    • \1:引用第一个分组。

    • \2:引用第二个分组,以此类推。

# 匹配重复的单词 (例如 "of of", "up up")
[laoma@shell ~]$ echo 'Is is the cost of of gasoline going up up?' | egrep -o '\b([a-z]+) \1\b'
of of
up up# 匹配连续出现多次的单词
[laoma@shell ~]$ echo 'Is is the cost of of of gasoline going up up?' | egrep -o '(\b[a-z]+\b\s+)\1{1,}'
of of of

七、 逻辑或

模式描述示例(egrep 命令)匹配结果(来自 words
``(ERE) 逻辑或`egrep 'cat

八、 综合应用:匹配有效 IPv4 地址

目标:从杂乱数据中过滤出有效的 IPv4 地址(每个 octet 介于 0-255)。

测试数据 (ip.txt):

0.0.0.0
1.1.1.1
11.11.11.111
111.111.111.111
999.9.9.9
01.1.1.1
10.0.0.0
0.1.1.1
266.1.1.1
248.1.1.1
256.1.1.1

解决方案:

# 使用 grep -E 匹配扩展正则表达式
grep -E '\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b' ip.txt

分步解释

  1. \b 单词边界:确保是独立的IP,不是更大数字的一部分。
  2. (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) 匹配 0-255
    • 25[0-5]:匹配 250-255
    • 2[0-4][0-9]:匹配 200-249
    • [01]?[0-9][0-9]?:匹配 0-199 (兼容 001 等形式)
  3. \. 匹配点号
  4. {3} 重复3次:匹配前三个数字和点号 (X.X.X.)。
  5. 最后再匹配一次 0-255,完成整个地址。
  6. \b 单词边界:结束。

匹配结果

0.0.0.0
1.1.1.1
11.11.11.111 # 111 是有效数字 (0-255)
111.111.111.111 # 111 是有效数字
10.0.0.0
0.1.1.1
248.1.1.1
# 排除掉了 999.9.9.9, 01.1.1.1, 266.1.1.1, 256.1.1.1

九、 速查表

目标模式或符号类别
任意字符.字符匹配
数字[0-9][[:digit:]]\d (部分工具)字符匹配
非数字[^0-9][^[:digit:]]\D (部分工具)字符匹配
单词字符[A-Za-z0-9_]\w字符匹配
非单词字符[^A-Za-z0-9_]\W字符匹配
空白[[:space:]]\s字符匹配
非空白[^[:space:]]\S字符匹配
行首^位置匹配
行尾$位置匹配
单词边界\b位置匹配
0次或多次*次数匹配
1次或多次+ (ERE)次数匹配
0次或1次? (ERE)次数匹配
精确n次{n} (ERE)次数匹配
范围次{m,n} (ERE)次数匹配
分组( ) (ERE)高级特性
反向引用\1, \2(ERE)高级特性
逻辑或`` (ERE)高级特性

Linux的正则表达式介绍就到这里,希望这份笔记能帮助您更高效地学习和复习!

http://www.dtcms.com/a/341715.html

相关文章:

  • 2D水平目标检测数据增强——旋转任意指定角度
  • RK3568 Linux驱动学习——设备树下 LED 驱动
  • Redisson最新版本(3.50.0左右)启动时提示Netty的某些类找不到
  • PowerShell脚本检查业务健康状态
  • 解决Docker 无法连接到官方镜像仓库
  • Lecture 6 Kernels, Triton 课程笔记
  • JVM基础知识总结
  • Docker 核心技术:Linux Cgroups
  • GDB 的多线程调试
  • 针对具有下垂控制光伏逆变器的主动配电网络的多目标分层协调电压/无功控制方法的复现
  • 音频读写速度优化 音频格式
  • Transformer内容详解(通透版)
  • pip install -e中e 参数解释
  • 八辊矫平机·第三篇
  • 卸载win10/win11系统里导致磁盘故障的补丁
  • 广东省省考备考(第八十二天8.20)——资料分析、数量、言语(强化训练)
  • 【蒸蒸日上】军八武将篇——标1
  • 8 webUI中-Controlnet(控制与约束)的应用分类与使用方法
  • 【语法】markdown非常用场景
  • Netty HashedWheelTimer设计原理:从时间轮算法到源码实现
  • 跨平台 RTSP/RTMP 播放器工程化实践:低延迟与高稳定性的挑战与突破
  • 【数据分享】东北大鼠疫传播与死亡空间数据
  • Vue透传 Attributes(详细解析)2
  • 恶补DSP:2.F28335的定时器系统
  • 买返商城网站源码多平台购物返现搭建图解源码二开
  • 万象生鲜配送系统 2025 年 8 月 15 日更新日志
  • 八月月报丨MaxKB在教育及教学科研领域的应用进展
  • Hadoop学习
  • 达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
  • HyDE vs HyPE:AI检索界的‘假想敌’革命,如何让RAG系统从‘找资料’变成‘懂你心’?”