c++11总结26——std::regex
std::regex 是 C++11 引入的 正则表达式库,用于 字符串匹配、搜索和替换。
🔹 头文件:#include <regex>
🔹 命名空间:std
🔹 支持的匹配模式:ECMAScript(默认)、POSIX 规则等。
主要组件
| 组件 | 作用 | 示例 |
|---|---|---|
std::regex | 正则表达式对象 | std::regex pattern("\\d+"); |
std::regex_match | 完全匹配字符串 | std::regex_match("123", pattern); |
std::regex_search | 搜索子串匹配 | std::regex_search("abc123", pattern); |
std::regex_replace | 替换匹配部分 | std::regex_replace("abc123", pattern, "***"); |
std::smatch | 存储匹配结果(字符串版) | std::smatch match; |
std::cmatch | 存储匹配结果(C 字符串版) | std::cmatch match; |
基本用法
(1)检查字符串是否完全匹配
#include <iostream>
#include <regex>int main() {std::string str = "123";std::regex pattern("\\d+"); // 匹配数字if (std::regex_match(str, pattern)) {std::cout << "完全匹配!" << std::endl;} else {std::cout << "匹配失败!" << std::endl;}
}
(2)搜索字符串中是否包含匹配项
#include <iostream>
#include <regex>int main() {std::string str = "abc123xyz";std::regex pattern("\\d+"); // 查找数字std::smatch match;// std::regex_search() 适用于 查找子字符串是否匹配 的情况if (std::regex_search(str, match, pattern)) {std::cout << "找到匹配: " << match[0] << std::endl;}
}
(3)字符串替换
#include <iostream>
#include <regex>int main() {std::string str = "hello 123 world";std::regex pattern("\\d+"); // 目标:匹配数字// std::regex_replace() 适用于 将匹配项替换为新内容std::string replaced = std::regex_replace(str, pattern, "***");std::cout << "替换后:" << replaced << std::endl;
}
(4)提取多个匹配项
#include <iostream>
#include <regex>int main() {std::string str = "email: test@example.com, contact: user@mail.com";std::regex pattern(R"([\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,})"); // 匹配邮箱std::smatch match;while (std::regex_search(str, match, pattern)) {std::cout << "找到邮箱: " << match[0] << std::endl;str = match.suffix(); // 继续查找}
}
语法
(1)常见正则语法
| 表达式 | 作用 | 示例匹配 |
|---|---|---|
\d | 数字 | "123" |
\w | 字母、数字、下划线 | "abc_123" |
. | 任意字符(除换行) | "a" "!" |
\s | 空格 | " " |
^ | 字符串开头 | ^abc 匹配 "abc123" 但不匹配 "1abc" |
$ | 字符串结尾 | abc$ 匹配 "123abc" |
+ | 至少一个 | \d+ 匹配 "123" "4567" |
* | 0 个或多个 | a* 匹配 "" "a" "aaaa" |
? | 0 或 1 个 | colou?r 匹配 "color" 和 "colour" |
{n,m} | 重复 n 到 m 次 | \d{2,4} 匹配 "12" "1234" |
() | 分组 | (\d+)-(\d+) |
| ` | ` | 或 |
(2)特殊匹配
| 语法 | 作用 |
|---|---|
(?:...) | 非捕获组 |
(?=...) | 正向预查 |
(?!...) | 负向预查 |
存在的问题
1. std::regex 在 GCC 4.8.5 及以下版本崩溃
GCC 4.8.5 的 std::regex 不稳定,容易崩溃。
解决方案:
-
升级 GCC 4.9+
-
使用
boost::regex代替 -
使用
pcre代替
2. std::regex 解析长字符串性能差
解决方案:
- 使用
std::sregex_iterator遍历字符串。 - 改用
boost::regex或pcre,它们更快。
3. std::regex_replace()处理大文本效率低
解决方案:
- 使用
std::ostringstream手动拼接字符串,减少替换操作。
方案对比
| 方法 | 适用场景 | 速度 | 兼容性 |
|---|---|---|---|
std::regex | C++11 及以上,简单匹配 | 较慢 | 仅 C++11+ |
boost::regex | C++98 兼容,功能强大 | 中等 | 兼容 C++98 |
PCRE | 高效匹配大文本 | 最快 | 需要安装 |
手写字符串查找 | 仅匹配简单内容 | 最快 | 兼容所有 C++ |
总结
| 功能 | 使用方法 |
|---|---|
| 完全匹配 | std::regex_match(str, pattern); |
| 搜索字符串 | std::regex_search(str, match, pattern); |
| 替换字符串 | std::regex_replace(str, pattern, "new"); |
| 遍历所有匹配 | std::sregex_iterator |
推荐
- 简单匹配:直接用
std::regex。 - 老版本 C++(C++98/C++03):使用
boost::regex。 - 高性能需求:使用
PCRE。
相关文章:
c++11总结26——std::regex
std::regex 是 C11 引入的 正则表达式库,用于 字符串匹配、搜索和替换。 🔹 头文件:#include <regex> 🔹 命名空间:std 🔹 支持的匹配模式:ECMAScript(默认)、POS…...
langchain教程-12.Agent/工具定义/Agent调用工具/Agentic RAG
前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...
leetcode_双指针 125.验证回文串
125.验证回文串 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s,如果它是回文串 ,返回 true ÿ…...
ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
文章目录 (文末提供数据集下载)ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练目标项目概述代码结构概述1. **主要类和文件**2. **命名空间和使用指令**3. **数据类 (TransactionObservation)**4. **主程序入口 (Main 方法)**5. **数据预处理 (DataPrepr…...
【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合
一、题目描述 某公司研发了一款高性能AI处理器,每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。 编号0~3的处理器处于同一链路中,编号4~7的处理器处于另外一个链路中,不同链路中的处理器不能通信,如…...
edu小程序挖掘严重支付逻辑漏洞
edu小程序挖掘严重支付逻辑漏洞 一、敏感信息泄露 打开购电小程序 这里需要输入姓名和学号,直接搜索引擎搜索即可得到,这就不用多说了,但是这里的手机号可以任意输入,只要用户没有绑定手机号这里我们输入自己的手机号抓包直接进…...
力扣 279. 完全平方数
🔗 https://leetcode.cn/problems/perfect-squares 题目 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量完全平方数可以拆解为两个相同数的乘积 思路 dp 公式,就是从看用哪个完全平方数 1 2 4 9…… 到当前 sum 的数量最少 代码 …...
鸿蒙生态潮起:开发者的逐浪之旅
鸿蒙生态潮起:开发者的逐浪之旅 在全球科技的澎湃浪潮中,鸿蒙生态宛如一座正在崛起的新大陆,熠熠生辉,吸引着无数开发者扬帆起航,探寻其中蕴藏的无限机遇,也直面诸多挑战。 鸿蒙生态的机遇,首先…...
Diskgenius系统迁移之后无法使用USB启动
前言 本文用于记录系统迁移中遇到的问题及解决方法,如有不对请指出,谢谢! 现象 使用DiskGenius进行系统迁移后,使用USB启动失败,反复在品牌logo和黑屏之间切换,期间还会在左上角显示”reset system“报错…...
Kafka 可靠性探究—副本刨析
Kafka 的多副本机制提升了数据容灾能力。 副本通常分为数据副本与服务副本。数据副本是指在不同的节点上持久化同一份数据;服务副本指多个节点提供同样的服务,每个节点都有能力接收来自外部的请求并进行相应的处理。 1 副本刨析 1.1 相关概念 AR&…...
我的博文天地测试报告
我的博文天地测试报告 文章目录 我的博文天地测试报告 一.项目背景 二.项目功能 2.1 功能介绍 三.测试分类 3.1 功能测试 3.1.1 测试用例 3.1.2 实际执行测试的部分操作步骤/结果的截图 3.2 自动化测试 3.3 性能测试 3.1.2 用户登录 jmeter性能测试结果 性能测试遇到的困难 …...
EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析
EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析 0 预览一 该文件功能`pdo_list.c` 文件功能函数预览二 函数功能介绍`pdo_list.c` 中主要函数的作用1. `ec_pdo_list_init`2. `ec_pdo_list_clear`3. `ec_pdo_list_clear_pdos`4. `ec_pdo_list_total_size`5. `ec_pdo_list_a…...
嵌入式开发神器:Buildroot的介绍和使用方法
目录 引言**Buildroot 能做什么?****1. 生成交叉编译工具链(Toolchain)****2. 生成嵌入式 Linux 根文件系统(RootFS)****3. 编译 Linux 内核和设备树文件****4. 编译 Bootloader(U-Boot)****5. …...
JavaScript系列(61)--边缘计算应用开发详解
JavaScript边缘计算应用开发详解 🌐 今天,让我们深入探讨JavaScript的边缘计算应用开发。边缘计算是一种将计算和数据存储分布到更靠近数据源的位置的架构模式,它能够提供更低的延迟和更好的实时性能。 边缘计算基础架构 🌟 &am…...
【LeetCode】day15 142.环形链表II
142. 环形链表 II - 力扣(LeetCode) 题目描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则…...
代理对象与目标对象
1. 定义:代理对象和目标对象 1.1 目标对象(Target Object) 目标对象是指 被增强的原始对象,即需要通过 AOP 切面(Aspect)增强功能的业务对象(原始类)。增强逻辑(Advice…...
【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信
引言 我们之前了解了在不同场景下,Kubernetes中Pod之间的通信是如何路由的。 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信现在,我们来看看在集群中,Pod与服务之间的通信是如何…...
DNN(深度神经网络)近似 Lyapunov 函数
import torch import torch.nn as nn import torch.optim as optim import matplotlib.pyplot as plt # from torchviz import make_dot import torchviz# 1. Lyapunov 函数近似器(MLP 结构) class LyapunovNet(nn.Module):def __init__(self, input_dim…...
128陷阱
首先我们了解一下关于包装器类型 java是面向对象的语言,但基本类型并不是面向对象的,从而出现了包装器类型,并且包装器添加了更多的属性和方法。如我们在使用集合类型Collection的时候就一定要使用包装类型而非基本类型,它相当于将…...
PromptSource和LangChain哪个更好
目录 1. 设计目标与定位 PromptSource LangChain 2. 功能对比 3. 优缺点分析 PromptSource LangChain 4. 如何选择? 5. 总结 PromptSource 和 LangChain 是两个在自然语言处理(NLP)领域非常有用的工具,但它们的设计目标和…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
