当前位置: 首页 > news >正文

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;
}
代码解析:
  1. 正则表达式

    R"((\d{4})-(\d{2})-(\d{2}))"
    

    • (\d{4}) 捕获4位数字(即年份)。
    • (\d{2}) 捕获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 中&#xff0c;正则表达式&#xff08;regex&#xff09;是一种用于匹配字符串模式的强大工具。正则表达式不仅能帮助你查找符合特定模式的字符&#xff0c;还能捕获匹配的子字符串&#xff08;即分组捕获&#xff09;。这篇文章将介绍 C 正则表达式中的分组捕获机制&…...

AI人工智能机器学习之降维和数据压缩

1、概要 本篇学习AI人工智能机器学习之降维和数据压缩&#xff0c;以主成分分析&#xff08;PCA, Principal Component Analysis&#xff09;为例&#xff0c;从代码层面讲述机器学习中的降维和数据压缩。 2、降维和数据压缩 - 简介 在机器学习和数据分析中&#xff0c;降维&…...

17 款电脑压缩工具详解及下载指南(2025 年最新版)

在数字时代,文件压缩是日常工作与生活中不可或缺的操作。无论是视频剪辑师压缩视频以便上传,还是普通用户节省存储空间,一款优质的压缩软件都能极大提升效率。本文将详细介绍 17 款热门电脑压缩软件,涵盖它们的特点、下载地址及适用场景,助你找到最适合自己的工具。 一、…...

DeepSeek开源周Day5压轴登场:3FS与Smallpond,能否终结AI数据瓶颈之争?

2025年2月28日&#xff0c;DeepSeek开源周迎来了第五天&#xff0c;也是本次活动的收官之日。自2月24日启动以来&#xff0c;DeepSeek团队以每天一个开源项目的节奏&#xff0c;陆续向全球开发者展示了他们在人工智能基础设施领域的最新成果。今天&#xff0c;他们发布了Fire-F…...

ROS2软件调用架构和机制解析:Publisher创建

术语 DDS (Data Distribution Service): 用于实时系统的数据分发服务标准&#xff0c;是ROS 2底层通信的基础RMW (ROS Middleware): ROS中间件接口&#xff0c;提供与具体DDS实现无关的抽象APIQoS (Quality of Service): 服务质量策略&#xff0c;控制通信的可靠性、历史记录、…...

【落羽的落羽 C++】C++入门基础·其之一

文章目录 一、C简介1. C的发展历史2. C参考文档 二、namespace命名空间1. C语言的一个缺陷2. namespace3. 命名空间的使用3.1 命名空间成员访问3.2 using展开 一、C简介 1. C的发展历史 C起源于1979年的贝尔实验室&#xff0c;Bjarne Stroustrup&#xff08;本贾尼博士&#…...

docker使用代理的简单配置

1准备代理服务器 准备代理服务器&#xff0c;例如192.168.120.168:52209 配置docker.service文件 查看service文件的位置 systemctl status docker 编辑service文件 vim /usr/lib/systemd/system/docker.service 添加代理配置 ... [Service] Environment"HTTP_PROXY…...

每日一题-设计食物评分系统,哈希表的有效使用

本题出自LeetCode2353.设计食物评分系统&#xff0c;连着一星期都是设计类的题目哈 题目 设计一个支持下述操作的食物评分系统&#xff1a; 修改 系统中列出的某种食物的评分。返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings 类&#xff1a; FoodRatings(Strin…...

大模型应用:多轮对话(prompt工程)

概述 在与大型语言模型&#xff08;如ChatGPT&#xff09;交互的过程中&#xff0c;我们常常体验到与智能助手进行连贯多轮对话的便利性。那么&#xff0c;当我们开启一个新的聊天时&#xff0c;系统是如何管理聊天上下文的呢&#xff1f; 一、初始上下文的建立 1. 创建新会…...

WSDM24-因果推荐|因果去偏的可解释推荐系统

1 动机 可解释推荐系统&#xff08;ERS&#xff09;通过提供透明的推荐解释&#xff0c;提高用户信任度和系统的说服力&#xff0c;如下图所示&#xff0c;然而&#xff1a; 1&#xff1a;现有工作主要关注推荐算法的去偏&#xff08;流行度偏差&#xff09;&#xff0c;但未显…...

VScode在Windows11中配置MSVC

因为MSVC编译器在vs当中&#xff0c;所以我们首先要安装vs的一部分组件。如果只是需要MSVC的话&#xff0c;工作负荷一个都不需要勾选&#xff0c;在单个组件里面搜索MSVC和windows11 SDK&#xff0c;其中一个是编译器&#xff0c;一个是头文件然后右下角安装即可。搜索Develop…...

数据库基础二(数据库安装配置)

打开MySQL官网进行安装包的下载 https://www.mysql.com/ 接着找到适用于windows的版本 下载版本 直接点击下载即可 接下来对应的内容分别是&#xff1a; 1&#xff1a;安装所有 MySQL 数据库需要的产品&#xff1b; 2&#xff1a;仅使用 MySQL 数据库的服务器&#xff1b; 3&a…...

cuda-12.4.0 devel docker 中源码安装 OpenAI triton

1&#xff0c;准备 docker 容器 下载docker image: $ sudo docker pull nvidia/cuda:12.6.2-devel-ubuntu20.04 创建容器&#xff1a; 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&#xff0c;或者兼容 Hive Metatore 的元数据服务&#xff0c;Doris 可以自动获取 Hive 的库表信息&#xff0c;并进行数据查询。 除了 Hive 外&#xff0c;很多其他系统也会使用 Hive Metastore 存储元数据。所以通过 Hive Catalog&#xff0c;我们不…...

【LeetCode】131.分割回文串

目录 题目描述输入输出示例及数据范围思路C 实现 题目描述 这道题目来自 LeetCode 131. 分割回文串。 题目描述如下&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 输入输出示例及数据…...

JeeWMS graphReportController.do SQL注入漏洞复现(CVE-2025-0392)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

基于Python+django+mysql旅游数据爬虫采集可视化分析推荐系统

2024旅游推荐系统爬虫可视化&#xff08;协同过滤算法&#xff09; 基于Pythondjangomysql旅游数据爬虫采集可视化分析推荐系统 有文档说明 部署文档 视频讲解 ✅️基于用户的协同过滤推荐算法 卖价就是标价~ 项目技术栈 Python语言、Django框架、MySQL数据库、requests网络爬虫…...

我的工作经历

主要说一下毕业工作大半年了一些心得与想法。 首先是因为本科不好的原因&#xff0c;单2硕士找了一个国企&#xff08;其实应该说是央企&#xff09;。也幸好找的是央企&#xff0c;后续工作基本上没有强度&#xff0c;不然后期神经衰弱抑郁症家里乱七八糟催婚的事情能把人逼疯…...

筑牢安全防线:工商业场所燃气泄漏防护新方案

燃气安全是企业经营不可逾越的生命线。在餐饮后厨、化工车间、酒店锅炉房等场所&#xff0c;可燃气体一旦泄漏&#xff0c;极易引发严重事故。如何实现精准监测、快速响应&#xff0c;成为工业及商业领域安全管理的核心诉求。旭华智能深耕安全监测领域&#xff0c;推出的工业及…...

基于STM32的智能停车场管理系统

1. 引言 传统停车场管理存在车位利用率低、停车体验差等问题&#xff0c;难以满足现代城市停车需求。本文设计了一款基于STM32的智能停车场管理系统&#xff0c;通过车位状态实时监测、智能导航与无感支付技术&#xff0c;实现停车资源的高效利用与用户服务的全面升级。 2. 系…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...