掌握正则表达式的力量:全方位解析PCRE的基础与进阶技能
Perl 兼容正则表达式(PCRE)是 Perl scripting language 中所使用的正则表达式语法标准。这些正则表达式在 Linux 命令行工具(如 grep -P
)及其他编程语言和工具中也有广泛应用。以下是一些基础和进阶特性,帮你掌握和使用 PCRE。
基本概念
1. 元字符
.
: 匹配除了换行符之外的任何单个字符。^
: 匹配行的开始。$
: 匹配行的结尾。*
: 匹配前一个字符或子表达式零次或多次。+
: 匹配前一个字符或子表达式一次或多次。?
: 匹配前一个字符或子表达式零次或一次。{n,m}
: 匹配前一个字符或子表达式至少 n 次,但不超过 m 次。[]
: 匹配括号内的任意字符。|
: 选择匹配,表示“或”。- \K:重置之前的匹配,使得最终匹配结果从 \K 之后开始。
2. 转义字符
\
: 转义下一个字符,使其变为普通字符或启用特殊字符。
3. 字符类
\d
: 匹配任何一个数字,相当于[0-9]
。\D
: 匹配任何一个非数字字符。\w
: 匹配任何一个字母、数字或下划线字符,相当于[a-zA-Z0-9_]
。\W
: 匹配任何一个非字母、数字或下划线字符。\s
: 匹配任何一个空白符(空格、制表符等)。\S
: 匹配任何一个非空白符。
特性与操作
捕获和非捕获组
(...)
: 捕获组,可以匹配并记住。(?:...)
: 非捕获组,只进行匹配不记忆。
后向引用
\n
: 引用前面第 n 个捕获组,例如\1
。
零宽断言
- 正向先行断言:
(?=...)
,确保接下来的字符与…匹配。 - 负向先行断言:
(?!...)
,确保接下来的字符不与…匹配。 - 正向后行断言:
(?<=...)
,确保前面的字符与…匹配。 - 负向后行断言:
(?<!...)
,确保前面的字符不与…匹配。
贪婪与懒惰
*
、+
、?
、{n,}
等默认是贪婪的,匹配尽可能多的字符。*?
、+?
、??
、{n,}?
等是懒惰的,匹配尽可能少的字符。
示例
匹配 IP 地址
grep -oP '\b\d{1,3}(\.\d{1,3}){3}\b'
\b
: 单词边界,确保 IP 地址独立。\d{1,3}
: 匹配 1 到 3 个数字。(\.\d{1,3}){3}
: 匹配.
及 1 到 3 个数字的组合,重复 3 次。
提取 IP 地址
假设你有如下命令输出:
inet 192.168.134.128/24 brd 192.168.134.255 scope global dynamic noprefixroute ens160
使用 grep
结合 \K
来提取第一个 IP 地址的命令如下:
ip a show ens160 | grep -oP 'inet \K[\d.]+'
解释
'inet \K[\d.]+'
:inet
:匹配前缀inet
。\K
:重置匹配的开始位置,忽略掉之前的inet
。[\d.]+
:匹配一个或多个数字和点字符,表示 IP 地址。
其他示例
提取域名
假设你有一行包含 URL 的文本:
Access the site at https://www.example.com/page now.
使用 grep
来提取域名的命令如下:
echo "Access the site at https://www.example.com/page now." | grep -oP 'https://\K[^/]+'
解释
'https://\K[^/]+'
:https://
:匹配 URL 的前缀https://
。\K
:重置匹配的开始位置,忽略掉之前的https://
。[^/]+
:匹配非/
字符的一个或多个,表示域名部分。
使用场景
- 过滤文本:例如从大段文本中提取特定部分信息(如 IP 地址、域名、关键字段等)。
- 增强脚本:在自动化任务和脚本中进行复杂文本处理。
注意事项
\K
只能在 PCRE 模式下使用,因此确保使用grep -P
而不是grep
或其它不支持 PCRE 的工具。- 对于更复杂的匹配,可能需要结合其他正则表达式特性(如捕获组、断言等)来实现。
邮箱地址
grep -oP '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
[a-zA-Z0-9._%+-]+
: 匹配邮箱用户名部分。@
: 匹配 @ 符号。[a-zA-Z0-9.-]+
: 匹配域名部分。\.[a-zA-Z]{2,}
: 匹配顶级域名部分。
实用工具
- 在线测试工具:如 regex101,支持 PCRE 语法,并且可以实时测试和调试你的正则表达式。
- 文本编辑工具:例如 Sublime Text 和 VSCode,都支持 PCRE 并提供强大的查找和替换功能。
实践
为了更好地掌握与应用 PCRE,多多练习和测试是最有效的方法。通过不断调整和优化你的正则表达式,会更好地理解它们的运行机制和应用场景。
相关文章:
掌握正则表达式的力量:全方位解析PCRE的基础与进阶技能
Perl 兼容正则表达式(PCRE)是 Perl scripting language 中所使用的正则表达式语法标准。这些正则表达式在 Linux 命令行工具(如 grep -P)及其他编程语言和工具中也有广泛应用。以下是一些基础和进阶特性,帮你掌握和使用…...
FastFM库,一款强大神奇的Python系统分析预测的工具
FastFM库概述 在机器学习领域,Factorization Machines(FM)是处理稀疏数据集中特征间交互的重要工具.Python的fastFM库提供了高效的实现,特别适合用于推荐系统、评分预测等任务.本文将全面介绍fastFM的安装、特性、基本和高级功能,并结合实际应用场景展示…...

R语言绘图 --- 饼状图(Biorplot 开发日志 --- 2)
「写在前面」 在科研数据分析中我们会重复地绘制一些图形,如果代码管理不当经常就会忘记之前绘图的代码。于是我计划开发一个 R 包(Biorplot),用来管理自己 R 语言绘图的代码。本系列文章用于记录 Biorplot 包开发日志。 相关链接…...
用于日常任务的实用 Python 脚本
Python 是一种多功能编程语言,以其简单易读而闻名。它广泛应用于从 Web 开发到数据分析等各个领域。Python 脚本,它们可以通过自动执行常见任务来使您的生活更轻松。 用于日常任务的实用 Python 脚本 1. 使用 Pandas 进行数据分析2. 使用 BeautifulSoup …...
7-Zip是什么呢
1. 简介 7-Zip 是一个功能强大、免费开源的文件压缩和解压缩工具,适用于个人用户和企业用户,可以在多种操作系统上进行使用,并且支持广泛的压缩格式和高级功能。 2. 特点与优势 开源免费:7-Zip 是免费的开源软件,可…...

Satellite Stereo Pipeline学习
1.在Anaconda某个环境中安装s2p pip install s2p 2.在Ubuntu系统中安装s2p源代码 git clone https://github.com/centreborelli/s2p.git --recursive cd s2p pip install -e ".[test]" 3.在s2p中进行make all处理 中间会有很多情况,基本上哪个包出问题…...
linux-gpio
在Linux shell中测试GPIO通信,通常需要使用GPIO的设备文件,这些文件通常位于/sys/class/gpio目录下。要使用特定的GPIO引脚,比如GPIO92,你需要执行以下步骤: 导出GPIO引脚:首先,需要确保GPIO92已…...

C# 代码配置的艺术
文章目录 1、代码配置的定义及其在软件工程中的作用2、C# 代码配置的基本概念和工具3、代码配置的实践步骤4、实现代码配置使用属性(Properties)使用配置文件(Config Files)使用依赖注入(Dependency Injection…...

268 基于matlab的模拟双滑块连杆机构运动
基于matlab的模拟双滑块连杆机构运动,并绘制运动动画,连杆轨迹可视化输出,并输出杆件质心轨迹、角速度、速度变化曲线。可定义杆长、滑块速度,滑块初始位置等参数。程序已调通,可直接运行。 268 双滑块连杆机构运动 连…...
进口铝合金电动隔膜泵
进口铝合金电动隔膜泵是一种高效、可靠的工业泵,其特点、性能与应用广泛,以下是对其的详细分析: 特点 材质与结构: 采用铝合金材料制造,具有良好的耐腐蚀性和轻量化特点。铝合金材质使得泵体结构紧凑、轻便ÿ…...

G4 - 可控手势生成 CGAN
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 代码总结与心得 代码 关于CGAN的原理上节已经讲过,这次主要是编写代码加载上节训练后的模型来进行指定条件的生成 图像的生成其实只需要使用…...

使用 DuckDuckGo API 实现多种搜索功能
在日常生活中,我经常使用搜索引擎来查找信息,如谷歌和百度。然而,当我想通过 API 来实现这一功能时,会发现这些搜索引擎并没有提供足够的免费 API 服务。如果有这样的免费 API, 就能定时获取“关注实体”的相关内容,并…...

【DrissionPage爬虫库 1】两种模式分别爬取Gitee开源项目
文章目录 DrissionPage爬虫库简介1. 浏览器操控模式(类似于游戏中的后台模拟鼠标键盘)2. 数据包收发模式(类似于游戏中的协议封包) 实战中学习需求:爬取Gitee开源项目的标题与描述解决方案1:用数据包方式获…...
leetcode 115.不同的子序列
思路:LCS类dp 这道题的思考思路其实就是把以两个字符串结尾作为状态方程。 dp[i][j]的意义就是在s字符串在以s[i]结尾的字符串的情况下,所能匹配出t字符串以t[j]结尾的字符串个数。 本质上其实是一个LCS类的状态方程,只不过是意义不一样了…...

二叉树的顺序实现-堆
一、什么是堆 在数据结构中,堆(Heap)是一种特殊的树形数据结构,用数组存储,通常被用来实现优先队列。 堆具有以下特点: 堆是一棵完全二叉树(Complete Binary Tree),即…...
【Maven】Maven主要知识点目录整理
1. Maven的基本概念 作者相关文章链接: 1、【Maven】简介_下载安装-CSDN博客 定义:Maven是Apache的一个开源项目,是Java开发环境中用于管理和构建项目,以及维护依赖关系的强大软件项目管理工具。作用:简化了项目依赖…...

Coolmuster Android Assistant: 手机数据管理的全能助手
在数字化时代,智能手机不仅是通讯工具,更是个人数据的中心。随着数据量的不断增加,如何有效管理和保护这些数据成为了一个重要议题。Coolmuster Android Assistant应运而生,它是一款专为安卓用户设计的综合数据管理软件࿰…...

03-树3 Tree Traversals Again(浙大数据结构PTA习题)
03-树3 Tree Traversals Again 分数 25 作者 陈越 An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, th…...

Java项目对接redis,客户端是选Redisson、Lettuce还是Jedis?
JAVA项目对接redis,客户端是选Redisson、Lettuce还是Jedis? 一、客户端简介1. Jedis介绍2. Lettuce介绍3. Redisson介绍 二、横向对比三、选型说明 在实际的项目开发中,对于一个需要对接Redis的项目来说,就面临着选择合适的Redis客…...
AngularJS Web前端框架:深入探索与应用实践
AngularJS Web前端框架:深入探索与应用实践 AngularJS,作为一款强大的Web前端框架,为开发者提供了丰富的功能和工具,使得构建复杂且交互性强的Web应用变得更为便捷。本文将从四个方面、五个方面、六个方面和七个方面对AngularJS进…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...