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)领域非常有用的工具,但它们的设计目标和…...
SpringBoot 整合 MyBatis 完整实战
SpringBoot MyBatis 可以说是国内后端开发最经典、最常用的组合了。本篇文章就来介绍一下SpringBoot如何整合MyBatis,实现数据表的增删改查。一、引言SpringBoot 整合 MyBatis 是国内 Java 后端最主流的持久层方案:• 灵活可控,SQL 可优化、…...
RAPTOR编程实战:从算法设计到图形化交互
1. RAPTOR入门:为什么它是最适合初学者的算法工具 第一次接触编程的人往往会被各种语法规则和复杂环境劝退。我教过不少零基础学生,发现他们最头疼的不是算法逻辑本身,而是记不住C的分号或者Python的缩进规则。这时候RAPTOR的优势就显现出来…...
Spring_couplet_generation 构建RESTful API最佳实践
Spring_couplet_generation 构建RESTful API最佳实践 最近在做一个挺有意思的小项目,想把一个春联生成模型包装成服务,方便其他应用调用。这让我重新思考了如何把一个AI模型能力,通过API的方式,既规范又稳定地提供出去。相信不少…...
Qwen2.5-14B-Instruct深度微调实录:像素剧本圣殿开源剧本创作指南
Qwen2.5-14B-Instruct深度微调实录:像素剧本圣殿开源剧本创作指南 1. 项目概览 像素剧本圣殿(Pixel Script Temple)是一款基于Qwen2.5-14B-Instruct大模型深度微调的专业剧本创作工具。这个开源项目将前沿AI技术与复古像素美学相结合&#…...
企业级数据治理最后一公里:Polars 2.0清洗审计日志、血缘追踪与合规性验证(GDPR-ready)
第一章:企业级数据治理最后一公里:Polars 2.0清洗审计日志、血缘追踪与合规性验证(GDPR-ready)在现代数据平台中,审计日志的结构化清洗与可追溯性验证常成为数据治理落地的瓶颈。Polars 2.0 凭借其零拷贝惰性执行引擎、…...
千问3.5-2B开源可部署实践:本地GPU环境一键启用,无云服务依赖
千问3.5-2B开源可部署实践:本地GPU环境一键启用,无云服务依赖 1. 模型介绍与核心能力 千问3.5-2B是Qwen系列中的小型视觉语言模型,专为图片理解与文本生成任务设计。这个开源模型最大的特点是能够同时处理视觉和语言信息,实现真…...
Tencent Hunyuan3D-1.0日志轮转配置:防止磁盘空间耗尽的日志管理方案
Tencent Hunyuan3D-1.0日志轮转配置:防止磁盘空间耗尽的日志管理方案 【免费下载链接】Hunyuan3D-1 腾讯开源的Hunyuan3D-1项目,创新提出两阶段3D生成方法,实现快速、高质量的文本到3D和图像到3D转换,融合Hunyuan-DiT模型…...
Wan2.2-I2V-A14B环境配置避坑指南:解决C盘空间不足与依赖冲突
Wan2.2-I2V-A14B环境配置避坑指南:解决C盘空间不足与依赖冲突 1. 引言 最近在Windows系统上配置Wan2.2-I2V-A14B环境时,我发现很多朋友都遇到了相同的问题:C盘空间莫名其妙被占满、各种依赖包冲突报错、CUDA版本不匹配等等。作为一个踩过所…...
告别复杂配置!Phi-3-Mini-128K一键部署实测:7GB显存跑通,小白也能玩转大模型
告别复杂配置!Phi-3-Mini-128K一键部署实测:7GB显存跑通,小白也能玩转大模型 1. 为什么选择Phi-3-Mini-128K 如果你正在寻找一个既强大又轻量的大语言模型,Phi-3-Mini-128K绝对值得考虑。这个由微软开发的模型虽然只有3.8亿参数…...
万象视界灵坛保姆级教程:Bright-Pixel UI下上传图片+输入神谕标签全流程
万象视界灵坛保姆级教程:Bright-Pixel UI下上传图片输入神谕标签全流程 1. 教程概述 万象视界灵坛是一款基于OpenAI CLIP技术的高级多模态智能感知平台,通过独特的Bright-Pixel UI设计,将复杂的图像语义分析转化为直观有趣的交互体验。本教…...
