正则表达式:文本处理的瑞士军刀
正则表达式:文本处理的瑞士军刀
正则表达式(Regular Expression,简称 Regex)是一种用于匹配、查找和操作文本的强大工具。它通过定义一种特殊的字符串模式,可以快速地在文本中搜索、替换或提取符合特定规则的内容。正则表达式广泛应用于编程、文本编辑、数据处理等领域,是每个开发者必备的技能之一。
一、正则表达式的核心概念
1. 模式(Pattern)
正则表达式的核心是一个模式字符串,它定义了需要匹配的文本规则。例如:
\d匹配任意数字(0-9)[a-z]匹配任意小写字母.*匹配任意字符(除换行符外)
2. 匹配(Match)
在目标文本中查找符合模式的内容。例如:
- 正则表达式
\d{3}可以匹配文本中的任意连续3个数字(如 “123”)。
3. 捕获组(Capture Group)
用括号 () 将部分模式括起来,可以提取匹配的子内容。例如:
- 正则表达式
(\d{4})-(\d{2})-(\d{2})可以匹配日期格式 “2023-10-05”,并分别捕获年、月、日。
二、正则表达式的语法规则
1. 基本元字符
| 元字符 | 描述 | 示例 |
|---|---|---|
. | 匹配任意单个字符(除换行符外) | a.c 匹配 “abc” |
\d | 匹配任意数字(0-9) | \d{3} 匹配 “123” |
\w | 匹配字母、数字或下划线 | \w+ 匹配 “hello_123” |
\s | 匹配空白字符(空格、制表符等) | \s+ 匹配 " " |
2. 量词
| 量词 | 描述 | 示例 |
|---|---|---|
* | 匹配前一个元素0次或多次 | a* 匹配 “”、“a”、“aa” |
+ | 匹配前一个元素1次或多次 | \d+ 匹配 “1”、“123” |
? | 匹配前一个元素0次或1次 | a? 匹配 “”、“a” |
{n} | 匹配前一个元素恰好n次 | \d{3} 匹配 “123” |
{n,m} | 匹配前一个元素至少n次,至多m次 | \d{2,4} 匹配 “12”、“1234” |
3. 字符类
| 语法 | 描述 | 示例 |
|---|---|---|
[abc] | 匹配括号内的任意一个字符 | [aeiou] 匹配 “a”、“e” |
[^abc] | 匹配不在括号内的任意字符 | [^0-9] 匹配 “a”、“!” |
[a-z] | 匹配范围内的任意字符 | [A-Za-z] 匹配大写或小写字母 |
4. 边界匹配
| 语法 | 描述 | 示例 |
|---|---|---|
^ | 匹配字符串的开头 | ^Hello 匹配 “Hello world” 的开头 |
$ | 匹配字符串的结尾 | world$ 匹配 “Hello world” 的结尾 |
\b | 匹配单词边界 | \bcat\b 匹配 “cat” 但不匹配 “category” |
三、正则表达式的应用场景
1. 数据验证
- 验证邮箱格式:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ - 验证手机号格式:
^1[3-9]\d{9}$
2. 文本搜索与替换
- 查找所有日期:
\d{4}-\d{2}-\d{2} - 替换HTML标签:
<[^>]+>
3. 数据提取
- 提取URL中的域名:
https?://([^/\s]+) - 提取文本中的所有数字:
\d+
四、正则表达式的编程实现(C++示例)
C++11 引入了 <regex> 库,支持正则表达式操作。以下是一个简单的示例:
#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "Contact us at support@example.com or sales@domain.com.";std::regex emailPattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)");auto words_begin = std::sregex_iterator(text.begin(), text.end(), emailPattern);auto words_end = std::sregex_iterator();std::cout << "Found emails:\n";for (std::sregex_iterator i = words_begin; i != words_end; ++i) {std::smatch match = *i;std::cout << match.str() << '\n';}return 0;
}
输出:
Found emails:
support@example.com
sales@domain.com
五、正则表达式的性能优化
1. 避免贪婪匹配
- 贪婪匹配(默认):
匹配整个<.*><div>content</div>。 - 非贪婪匹配:
匹配<.*?><div>和</div>两个标签。
2. 预编译正则表达式
在多次使用同一正则表达式时,预编译可以显著提高性能:
std::regex emailPattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b)");
3. 使用非捕获组
如果不需要捕获组的内容,使用 (?:...) 可以提高性能:
(?:\d{4})-(?:\d{2})-(?:\d{2})
六、正则表达式的学习资源
-
在线测试工具:
- Regex101
- RegExr
-
经典书籍:
- 《精通正则表达式》(Jeffrey E.F. Friedl)
- 《正则表达式必知必会》
-
练习平台:
- LeetCode 正则表达式题目
- HackerRank Regex Challenges
正则表达式是文本处理的利器,但也需要谨慎使用。掌握其核心语法和优化技巧,可以让你在数据处理中事半功倍!
相关文章:
正则表达式:文本处理的瑞士军刀
正则表达式:文本处理的瑞士军刀 正则表达式(Regular Expression,简称 Regex)是一种用于匹配、查找和操作文本的强大工具。它通过定义一种特殊的字符串模式,可以快速地在文本中搜索、替换或提取符合特定规则的内容。正…...
【负载均衡系列】HAProxy
HAProxy(High Availability Proxy)是一款高性能的 TCP/HTTP 负载均衡器,专注于提供高可用性、灵活性和可靠性。以下是关于HAProxy的详细解析,涵盖其工作原理、工作机制、工作模式等核心方面: 一、HAProxy 工作原理 HAProxy的核心职责是将客户端请求高效、可靠地分发到后…...
设计模式之责任链模式:原理、实现与应用
引言 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者与接收者之间的耦合。责任链模式通过将多个处理对象连接成一条链,使得请求沿着链传递&am…...
20250318在ubuntu20.04中安装向日葵
rootrootrootroot-X99-Turbo:~$ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb rootrootrootroot-X99-Turbo:~$ sudo apt-get install -f rootrootrootroot-X99-Turbo:~$ sudo dpkg -i SunloginClient_15.2.0.63064_amd64.deb 20250318在ubuntu20.04中安装向日葵 2025/3…...
Kotlin的 noinline和crossinline关键字
noinline 顾名思义,noinline的意思就是不内联,这个关键字只能作用于内联高阶函数的某个函数类型的参数上,表明当前的函数参数不参与高阶函数的内联: inline fun fun1(doSomething1: () -> Unit, noinline doSomething2: () -&…...
区块链交易签名相关知识总结
基础概念 签名流程 安全相关问题 实际场景 代码示例 进阶问题 一、基础概念 1. 为什么区块链交易需要签名? 答案: 身份认证:证明交易由私钥持有者发起。 数据完整性:确保交易内容未被篡改。 抗抵赖性:签名者无…...
Spring Boot集成Redis并设置密码后报错: NOAUTH Authentication required
报错信息: io.lettuce.core.RedisCommandExecutionException: NOAUTH Authentication required.Redis密码配置确认无误,但是只要使用Redis存储就报这个异常。很可能是因为配置的spring.redis.password没有被读取到。 基本依赖: implementat…...
如何记录Matlab程序运行过程中所占用的最大内存(续)
在上一篇博客中,我们讨论了如何记录Matlab程序运行过程中所占用的最大内存。 博客原文:如何记录Matlab程序运行过程中所占用的最大内存-CSDN博客 但经过测试发现,这与实际有非常大的差异。运行如下例子: clear;clc; profile on…...
分布式节点池:群联云防护抗DDoS的核心武器
一、节点池的核心作用与架构设计 1. 全球分布式节点布局 物理层防御: 根据产品文档,群联在全球部署“海量分布式节点”,每个节点具备独立清洗能力,攻击流量被分散至不同区域节点处理。优势:避免传统单节点防护的瓶颈&…...
Java线程池深度解析:从使用到调优
适合人群:Java中级开发者 | 并发编程入门者 | 系统调优实践者 目录 一、引言:为什么线程池是Java并发的核心? 二、线程池核心知识点详解 1. 线程池核心参数与原理 2. 线程池的创建与使用 (1) 基础用法示例 (2) 内置线程池的隐患 3. 线…...
自动驾驶背后的数学:多模态传感器融合的简单建模
上一篇博客自动驾驶背后的数学:特征提取中的线性变换与非线性激活 以单个传感器为例,讲解了特征提取中的线性变换与非线性激活。 这一篇将以多模态传感器融合为例,讲解稍复杂的线性变换和非线性激活应用场景。 (一)权重矩阵的张量积分解 y = W x + b = [ w 11 ⋯ w 1 n ⋮…...
12 File文件对象:创建、获取基本信息、遍历文件夹、查找文件;字符集的编解码 (黑马Java视频笔记)
文章目录 File >> 存储数据的方案1. 认识File2. File操作2.1 创建File对象2.2 File操作1)对文件对象的信息的操作2)文件/文件夹的创建/删除3)⭐⭐对文件夹的遍历 3. 方法递归3.1 认识递归3.2 递归算法及其执行流程1) 案例:2…...
HTML应用指南:利用GET请求获取猫眼电影日票房信息——以哪吒2为例
2025年春节档期,国产动画电影《哪吒之魔童闹海》(以下简称《哪吒2》)以颠覆性的叙事风格与工业化制作水准震撼登场,不仅刷新了中国动画电影的票房纪录,更成为全球影史现象级作品。影片凭借春节档期的爆发式开局、持续5…...
荣耀手机卸载应用商店、快应用中心等系统自带的
1.下载abd ADB Download - Get the latest version of ADB and fastboot 2.手机打开开发者选项 3.手机接电脑打开USB调试 4.下载MT管理器查看系统包名 D:\1.LFD\ADB\platform-tools-latest-windows\platform-tools>adb shell adb.exe: no devices/emulators found 这边是…...
[AI速读]用持续集成(CI)优化芯片验证环境:Jenkins与EDA工具的实战指南
在芯片验证中,回归测试(Regression Test)是确保设计稳定性的关键步骤。但随着设计复杂度增加,手动管理海量测试用例、分析日志和覆盖率数据变得异常耗时。本文将介绍如何利用持续集成(CI)工具Jenkins,结合EDA验证环境(如Cadence vManager),实现自动化测试与结果分析,…...
苍穹外卖学习笔记
整体概述 1).用户层 本项目中在构建系统管理后台的前端页面,我们会用到H5、Vue.js、ElementUI、apache echarts(展示图表)等技术。而在构建移动端应用时,我们会使用到微信小程序 2).网关层 Nginx是一个服务器,主要用来作为Http服务器&…...
Spring常用注解汇总
1. IOC容器与Bean管理 注解说明示例Component通用注解,标记类为Spring Bean Component public class MyService { ... } Controller标记Web控制器(应用在MVC的控制层) Controller public class UserController { ... } Service标记业务逻辑层…...
深度强化学习中的深度神经网络优化策略:挑战与解决方案
I. 引言 深度强化学习(Deep Reinforcement Learning,DRL)结合了强化学习(Reinforcement Learning,RL)和深度学习(Deep Learning)的优点,使得智能体能够在复杂的环境中学…...
每日一题力扣2974.最小数字游戏c++
2974. 最小数字游戏 - 力扣(LeetCode) class Solution { public:vector<int> numberGame(vector<int>& nums) {vector<int> arr(nums.size());sort(nums.begin(),nums.end());for(size_t i0;i<nums.size();i2){arr[i]nums[i1]…...
软考中级-软件设计师 准备
软考中级-软件设计师 准备 一、软考相关1.1、考试时间1.2、考试时长1.3、题型和分值: 二、软考备考2.1、相关书籍2.2、推荐课程:B站up主zst_20012.3、学习路线 一、软考相关 1.1、考试时间 一年有两次软考,一般是五月末和十一月的中旬 以下…...
EasyRTC嵌入式音视频通信SDK:WebRTC技术下的硬件与软件协同演进,开启通信新时代
在当今数字化时代,智能设备的普及和人们对实时通信需求的不断增长,推动了嵌入式音视频通信技术的快速发。EasyRTC嵌入式音视频通信SDK凭借其独特的技术特点和应用优势,在嵌入式设备和多平台实时通信领域脱颖而出。 1、轻量级设计与高性能 Ea…...
lua垃圾回收
lua垃圾回收 lua 垃圾回收 lua 垃圾回收 collectgarbage(“count”)获取当前lua脚本占用内存字节数(单位为KB)。 collectgarbage(“collect”)执行一次垃圾回收。 xxxnil 将变量置为空,会释放内存。 lua中的机制和c#中回收机制很类似 解除羁绊(置为空)。 --垃圾回…...
Lineageos 22.1(Android 15)实现负一屏
一、前言 方案是参考的这位大佬的,大家可以去付费订阅支持一波。我大概理一下Android15的修改。 大佬的方案代码 二、Android15适配调整 1.bp调整,加入aidl引入,这样make之后就可以索引代码了 filegroup {name: "launcher-src"…...
《深度学习》——YOLOv3详解
文章目录 YOLOv3简介YOLOv3核心原理YOLOv3改进YOLOv3网络结构 YOLOv3简介 YOLOv3(You Only Look Once, version 3)是一种先进的实时目标检测算法,由 Joseph Redmon 和 Ali Farhadi 开发。它在目标检测领域表现出色,具有速度快、精…...
【设计模式】三十一、状态模式
系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式核心思想二、模式结构三、Java代码示例:订单状态管理1. 定义状态接口2. 实现具体状态类3. 上下文类(Context)4. 客户端调用5. 运行截图 四、状…...
vue 获取当前时间并自动刷新
新增需求,需要在大屏的右上角展示当前时间,并实时按秒刷新,通过通义千问搜索关键js代码后,整理出如下代码。 【效果图】 【HTML】 <div class"time-wrap">{{ formattedDateTime }}<span> {{ weekTime }}&…...
C 语 言 --- 扫 雷 游 戏(初 阶 版)
C 语 言 --- 扫 雷 游 戏 初 阶 版 代 码 全 貌 与 功 能 介 绍扫雷游戏的功能说明游 戏 效 果 展 示游 戏 代 码 详 解game.htest.cgame.c 总结 💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 C 语 言 💡个 人 主…...
WebDeveloper靶机详解
一、主机发现 arp-scan -l靶机ip为192.168.55.163 二、端口扫描、目录枚举、漏洞扫描、指纹识别 2.1端口扫描 nmap --min-rate 10000 -p- 192.168.55.163发现并无特殊端口开放 扫描一下UDP端口 nmap -sU --min-rate 10000 -p- 192.168.55.163没有扫描到UDP端口 2.2目录枚…...
Cursor IDE 入门指南
什么是 Cursor? Cursor 是一款集成了 AI 功能的现代代码编辑器,基于 VSCode 开发,专为提高开发效率而设计。它内置强大的 AI 助手功能,能够理解代码、生成代码、解决问题,帮助开发者更快、更智能地完成编程任务。 基础功能 1.…...
来源于胡椒的亚甲二氧桥CYP450-文献精读119
Piper nigrum CYP719A37 Catalyzes the Decisive Methylenedioxy Bridge Formation in Piperine Biosynthesis 胡椒 (Piper nigrum) CYP719A37 催化胡椒碱生物合成中关键的亚甲二氧桥形成 摘要 胡椒 (Piper nigrum) 是世界上最受欢迎的香料之一。其主要辛辣成分胡椒碱 (piper…...
