C++ 正则表达式分组捕获入门指南
在 C++ 中,正则表达式(regex)是一种用于匹配字符串模式的强大工具。正则表达式不仅能帮助你查找符合特定模式的字符,还能捕获匹配的子字符串(即分组捕获)。这篇文章将介绍 C++ 正则表达式中的分组捕获机制,并提供多个示例代码来帮助你快速入门。
一、基本概念:正则表达式分组捕获
正则表达式分组捕获是一种能够将匹配的部分提取出来的技术。在 C++ 中,正则表达式分组捕获通常通过小括号 () 来实现。每个分组会捕获匹配到的子字符串,并且可以在代码中通过相应的索引访问它们。
分组的基本语法
():用于定义捕获分组。你可以在正则表达式中使用多个分组,C++ 中从1开始对分组编号。
示例:简单分组捕获
假设我们需要从一个日期字符串中提取年月日,可以使用正则表达式中的分组捕获来实现。
二、C++ 正则表达式库:<regex>
在 C++ 中使用正则表达式时,需要包含头文件 <regex>。基本的正则表达式操作包括:
std::regex:正则表达式对象。std::smatch:保存匹配结果的对象。std::regex_search:查找匹配。std::regex_match:完全匹配整个字符串。std::regex_replace:替换匹配的字符串。
三、示例代码:日期分组捕获
我们可以编写一个示例程序,从一个字符串中提取出日期的年、月和日。
示例 1:提取日期(YYYY-MM-DD)
假设我们有一个日期字符串 2023-02-25,并希望通过正则表达式捕获出年、月、日。
#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "2023-02-25";// 正则表达式:捕获年、月和日std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");std::smatch matches;// 如果匹配成功if (std::regex_match(input, matches, pattern)) {// 输出捕获的各个分组std::cout << "Year: " << matches[1] << std::endl;std::cout << "Month: " << matches[2] << std::endl;std::cout << "Day: " << matches[3] << std::endl;} else {std::cout << "No match found." << std::endl;}return 0;
}
代码解析:
-
正则表达式
R"((\d{4})-(\d{2})-(\d{2}))":
(\d{4})捕获4位数字(即年份)。(\d{2})捕获2位数字(即月份和日期)。
-
matches[1]、matches[2]、matches[3]分别存储匹配到的年份、月份和日期。
输出:
Year: 2023
Month: 02
Day: 25
四、捕获多个匹配
有时我们需要从文本中查找多个匹配项。std::regex_search 可以用于查找匹配,但它只会找到第一个匹配项。如果你想捕获所有匹配项,可以使用 std::regex_iterator。
示例 2:提取所有匹配的日期
假设我们有一段文本,其中包含多个日期,我们希望提取所有日期。
#include <iostream>
#include <regex>
#include <string>
#include <iterator>int main() {std::string input = "The event will be held on 2023-02-25, followed by another on 2024-03-01.";// 正则表达式:捕获日期std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");std::smatch matches;// 使用 regex_iterator 查找所有匹配auto begin = std::sregex_iterator(input.begin(), input.end(), pattern);auto end = std::sregex_iterator();for (auto it = begin; it != end; ++it) {std::cout << "Found date: " << it->str() << std::endl;}return 0;
}
输出:
Found date: 2023-02-25
Found date: 2024-03-01
使用 std::regex_search 来查找日期的所有匹配
#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "The event will be held on 2023-02-25, followed by another on 2024-03-01.";// 正则表达式:捕获日期std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");std::smatch matches;// 使用 cbegin 和 cend 来获取常量迭代器auto begin = input.cbegin();while (std::regex_search(begin, input.cend(), matches, pattern)) {// 输出匹配到的日期std::cout << "Found date: " << matches[0] << std::endl;// 更新搜索起始位置,继续从上一个匹配位置之后开始搜索begin = matches[0].second;}return 0;
}
输出:
Found date: 2023-02-25
Found date: 2024-03-01
五、捕获和替换(regex_replace)
正则表达式不仅可以用于查找和捕获,还可以用于替换匹配的内容。通过 std::regex_replace,你可以将捕获到的内容替换成新的内容。
示例 3:替换日期格式
假设我们希望将日期格式从 YYYY-MM-DD 更改为 DD/MM/YYYY。
#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "The event will be held on 2023-02-25, and another on 2024-03-01.";// 正则表达式:捕获日期std::regex pattern(R"((\d{4})-(\d{2})-(\d{2}))");// 使用 regex_replace 将日期格式替换为 DD/MM/YYYYstd::string output = std::regex_replace(input, pattern, R"($3/$2/$1)");std::cout << "Updated text: " << output << std::endl;return 0;
}
输出:
Updated text: The event will be held on 25/02/2023, and another on 01/03/2024.
六、进阶应用:捕获多个分组
当正则表达式中有多个分组时,你可以通过 matches[n] 访问每个分组的捕获结果。
示例 4:捕获多个分组(例如,提取姓名和年龄)
#include <iostream>
#include <regex>
#include <string>int main() {std::string input = "John Doe, Age: 30; Jane Smith, Age: 25";// 正则表达式:捕获姓名和年龄std::regex pattern(R"((\w+ \w+), Age: (\d+))");std::smatch matches;// 查找匹配auto begin = std::sregex_iterator(input.begin(), input.end(), pattern);auto end = std::sregex_iterator();for (auto it = begin; it != end; ++it) {std::cout << "Name: " << it->str(1) << ", Age: " << it->str(2) << std::endl;}return 0;
}
输出:
Name: John Doe, Age: 30
Name: Jane Smith, Age: 25
七、总结
正则表达式的分组捕获是一个非常强大的工具,它能够让你轻松提取和操作字符串中的特定部分。C++ 中的 <regex> 库提供了灵活的接口,允许你使用正则表达式进行模式匹配、捕获分组、查找多个匹配项以及进行替换操作。通过本文的示例代码,希望你能掌握 C++ 中正则表达式分组捕获的基础应用,并能在实际项目中灵活使用正则表达式来处理文本数据。
相关文章:
C++ 正则表达式分组捕获入门指南
在 C 中,正则表达式(regex)是一种用于匹配字符串模式的强大工具。正则表达式不仅能帮助你查找符合特定模式的字符,还能捕获匹配的子字符串(即分组捕获)。这篇文章将介绍 C 正则表达式中的分组捕获机制&…...
AI人工智能机器学习之降维和数据压缩
1、概要 本篇学习AI人工智能机器学习之降维和数据压缩,以主成分分析(PCA, Principal Component Analysis)为例,从代码层面讲述机器学习中的降维和数据压缩。 2、降维和数据压缩 - 简介 在机器学习和数据分析中,降维&…...
17 款电脑压缩工具详解及下载指南(2025 年最新版)
在数字时代,文件压缩是日常工作与生活中不可或缺的操作。无论是视频剪辑师压缩视频以便上传,还是普通用户节省存储空间,一款优质的压缩软件都能极大提升效率。本文将详细介绍 17 款热门电脑压缩软件,涵盖它们的特点、下载地址及适用场景,助你找到最适合自己的工具。 一、…...
DeepSeek开源周Day5压轴登场:3FS与Smallpond,能否终结AI数据瓶颈之争?
2025年2月28日,DeepSeek开源周迎来了第五天,也是本次活动的收官之日。自2月24日启动以来,DeepSeek团队以每天一个开源项目的节奏,陆续向全球开发者展示了他们在人工智能基础设施领域的最新成果。今天,他们发布了Fire-F…...
ROS2软件调用架构和机制解析:Publisher创建
术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准,是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口,提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略,控制通信的可靠性、历史记录、…...
【落羽的落羽 C++】C++入门基础·其之一
文章目录 一、C简介1. C的发展历史2. C参考文档 二、namespace命名空间1. C语言的一个缺陷2. namespace3. 命名空间的使用3.1 命名空间成员访问3.2 using展开 一、C简介 1. C的发展历史 C起源于1979年的贝尔实验室,Bjarne Stroustrup(本贾尼博士&#…...
docker使用代理的简单配置
1准备代理服务器 准备代理服务器,例如192.168.120.168:52209 配置docker.service文件 查看service文件的位置 systemctl status docker 编辑service文件 vim /usr/lib/systemd/system/docker.service 添加代理配置 ... [Service] Environment"HTTP_PROXY…...
每日一题-设计食物评分系统,哈希表的有效使用
本题出自LeetCode2353.设计食物评分系统,连着一星期都是设计类的题目哈 题目 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分。返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings 类: FoodRatings(Strin…...
大模型应用:多轮对话(prompt工程)
概述 在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢? 一、初始上下文的建立 1. 创建新会…...
WSDM24-因果推荐|因果去偏的可解释推荐系统
1 动机 可解释推荐系统(ERS)通过提供透明的推荐解释,提高用户信任度和系统的说服力,如下图所示,然而: 1:现有工作主要关注推荐算法的去偏(流行度偏差),但未显…...
VScode在Windows11中配置MSVC
因为MSVC编译器在vs当中,所以我们首先要安装vs的一部分组件。如果只是需要MSVC的话,工作负荷一个都不需要勾选,在单个组件里面搜索MSVC和windows11 SDK,其中一个是编译器,一个是头文件然后右下角安装即可。搜索Develop…...
数据库基础二(数据库安装配置)
打开MySQL官网进行安装包的下载 https://www.mysql.com/ 接着找到适用于windows的版本 下载版本 直接点击下载即可 接下来对应的内容分别是: 1:安装所有 MySQL 数据库需要的产品; 2:仅使用 MySQL 数据库的服务器; 3&a…...
cuda-12.4.0 devel docker 中源码安装 OpenAI triton
1,准备 docker 容器 下载docker image: $ sudo docker pull nvidia/cuda:12.6.2-devel-ubuntu20.04 创建容器: sudo docker run --gpus all -it --name cuda_LHL_01 -v /home/hongleili/ex_triton/tmp1:/root/ex_triton/tmp1 nvidia/cuda:12.6…...
doris: Hive Catalog
通过连接 Hive Metastore,或者兼容 Hive Metatore 的元数据服务,Doris 可以自动获取 Hive 的库表信息,并进行数据查询。 除了 Hive 外,很多其他系统也会使用 Hive Metastore 存储元数据。所以通过 Hive Catalog,我们不…...
【LeetCode】131.分割回文串
目录 题目描述输入输出示例及数据范围思路C 实现 题目描述 这道题目来自 LeetCode 131. 分割回文串。 题目描述如下: 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 输入输出示例及数据…...
JeeWMS graphReportController.do SQL注入漏洞复现(CVE-2025-0392)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统
2024旅游推荐系统爬虫可视化(协同过滤算法) 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…...
我的工作经历
主要说一下毕业工作大半年了一些心得与想法。 首先是因为本科不好的原因,单2硕士找了一个国企(其实应该说是央企)。也幸好找的是央企,后续工作基本上没有强度,不然后期神经衰弱抑郁症家里乱七八糟催婚的事情能把人逼疯…...
筑牢安全防线:工商业场所燃气泄漏防护新方案
燃气安全是企业经营不可逾越的生命线。在餐饮后厨、化工车间、酒店锅炉房等场所,可燃气体一旦泄漏,极易引发严重事故。如何实现精准监测、快速响应,成为工业及商业领域安全管理的核心诉求。旭华智能深耕安全监测领域,推出的工业及…...
基于STM32的智能停车场管理系统
1. 引言 传统停车场管理存在车位利用率低、停车体验差等问题,难以满足现代城市停车需求。本文设计了一款基于STM32的智能停车场管理系统,通过车位状态实时监测、智能导航与无感支付技术,实现停车资源的高效利用与用户服务的全面升级。 2. 系…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...
