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)领域非常有用的工具,但它们的设计目标和…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Go 语言接口详解
Go 语言接口详解 核心概念 接口定义 在 Go 语言中,接口是一种抽象类型,它定义了一组方法的集合: // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的: // 矩形结构体…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
