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

c++正则表达式及其使用,超级详细

文章目录

  • 概述
  • 正则表达式语法
  • 正则表达式操作
    • std::regex_match
    • std::regex_replace
    • std::regex_search
  • 实例
    • 匹配邮箱
    • 替换 HTML 标签
    • 搜索 URL
  • 总结

概述

正则表达式是一种用于匹配字符串的工具,可以在文本中查找特定的模式,并且可以快速地对字符串进行搜索和处理。C++ 11 引入了正则表达式标准库,使得 C++ 开发者可以轻松地利用正则表达式的强大功能。

本篇博文将为你介绍 C++ 正则表达式的基础知识,包括如何定义正则表达式,如何进行匹配和替换等操作。同时,我们将提供大量的实例来帮助您深入理解。

正则表达式语法

正则表达式是由一系列字符和特殊字符组成的模式,用于描述一类字符串。正则表达式的语法非常灵活,不同的字符和组合可以匹配不同的字符串。下面是一些常见的正则表达式语法:

  • 字符:普通字符表示匹配自身,例如匹配字母 a 就是一个普通字符 a。
  • 字符组:字符组用 [] 表示,可以匹配其中任意一个字符。例如匹配小写字母就是一个字符组 [a-z]。
  • 量词:量词表示匹配次数,例如匹配一个数字可以用量词 \d 表示,其中 \d 表示匹配一个数字字符,+ 表示匹配一次或多次。
  • 边界:边界用于限制匹配范围,例如匹配以数字开头的字符串可以使用边界 ^ 表示,表示匹配以开头的字符。
  • 特殊字符:一些特殊字符用于表示空格、换行、制表符等不可见字符。例如表示换行符的字符是 \n。

正则表达式操作

C++ 的正则表达式标准库提供了多种操作,可以对字符串进行匹配、替换、搜索等操作。下面是一些常见的操作:

std::regex_match

std::regex_match 函数用于对一个字符串进行匹配,判断该字符串是否符合指定的正则表达式。该函数的语法如下:

bool std::regex_match(const std::string& str, const std::regex& re);

其中 str 表示待匹配的字符串,re 表示正则表达式。函数返回一个布尔值,表示匹配结果。例如下面的代码可以用来判断字符串 s 是否是一个数字:

#include <regex>
#include <iostream>
using namespace std;int main() {string s = "123";regex re("\\d+");if (regex_match(s, re)) {cout << "Match!" << endl;} else {cout << "Not match!" << endl;}return 0;
}

std::regex_replace

std::regex_replace函数用于对一个字符串进行替换,将符合指定正则表达式的部分替换为指定的字符串。该函数的语法如下:

std::string std::regex_replace(const std::string& str, const std::regex& re, const std::string& replacement);

其中 str 表示待替换的字符串,re 表示正则表达式,replacement 表示替换字符串。函数返回一个新的字符串,表示替换后的结果。例如下面的代码可以用来将字符串中的数字替换为 ***:


#include <regex>
#include <iostream>
using namespace std;int main() {string s = "123 abc 456 def";regex re("\\d+");string result = regex_replace(s, re, "***");cout << result << endl;  // 输出 "*** abc *** def"return 0;
}

std::regex_search

std::regex_search 函数用于在一个字符串中搜索符合指定正则表达式的子字符串。该函数的语法如下:

bool std::regex_search(const std::string& str, const std::regex& re);

其中 str 表示待搜索的字符串,re 表示正则表达式。函数返回一个布尔值,表示搜索结果。例如下面的代码可以用来搜索字符串 s 中是否包含数字:

#include <regex>
#include <iostream>
using namespace std;int main() {string s = "123 abc";regex re("\\d+");if (regex_search(s, re)) {cout << "Match!" << endl;} else {cout << "Not match!" << endl;}return 0;
}

实例

下面提供一些常见的实例,帮助您更深入地理解 C++ 正则表达式的使用:

匹配邮箱


#include <regex>
#include <iostream>
using namespace std;int main() {string email = "test@example.com";regex re("[\\w.-]+@[\\w.-]+\\.\\w+");if (regex_match(email, re)) {cout << "Valid email!" << endl;} else {cout << "Invalid email!" << endl;}return 0;
}

替换 HTML 标签


#include <regex>
#include <iostream>
using namespace std;int main() {string html = "<p>Hello, world!</p>";regex re("<[^>]*>");string result = regex_replace(html, re, "");cout << result << endl;  // 输出 "Hello, world!"return 0;
}

搜索 URL

#include <regex>
#include <iostream>
using namespace std;int main() {string text = "Visit our website at http://example.com";regex re("https?://[\\w./]+");smatch match;if (regex_search(text, match, re)) {cout << "URL found: " << match[0] << endl;} else {cout << "URL not found!" << endl;}return 0;
}

总结

本篇博文介绍了 C++ 正则表达式的基础知识,包括正则表达式的语法、C++ 标准库中的正则表达式类以及常见的正则表达式函数。正则表达式是一种十分强大的字符串处理工具,它可以用来检查字符串是否符合某种规律、提取字符串中的有用信息以及替换字符串中的部分内容等等。

在使用正则表达式时,我们需要注意正则表达式的语法和函数的使用方法。有些正则表达式的语法在 C++ 中需要进行转义,例如 .、\ 和 + 等字符。同时,C++ 标准库中的正则表达式类提供了一些函数,例如 std::regex_match、std::regex_replace 和 std::regex_search 等,可以用来进行字符串的匹配、替换和搜索等操作。

在实际使用中,我们可以根据具体的需求编写不同的正则表达式来实现字符串处理的功能。例如,我们可以使用正则表达式来匹配邮箱、替换 HTML 标签和搜索 URL 等等。正则表达式在现代编程语言中得到了广泛的应用,对于字符串处理的需求,它是一个十分重要的工具。

相关文章:

c++正则表达式及其使用,超级详细

文章目录 概述正则表达式语法正则表达式操作std::regex_matchstd::regex_replacestd::regex_search 实例匹配邮箱替换 HTML 标签搜索 URL 总结 概述 正则表达式是一种用于匹配字符串的工具&#xff0c;可以在文本中查找特定的模式&#xff0c;并且可以快速地对字符串进行搜索和…...

【LeetCode: 剑指 Offer II 099. 最小路径之和 | 暴力递归 | DFS =>记忆化搜索=>动态规划】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…...

Python OpenCV 计算机视觉:6~7

原文&#xff1a;OpenCV Computer Vision with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 计算机视觉 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 当别人说你没有底线的时候&#xff0c;你最…...

LabView中数组的使用2-1

在LabView中&#xff0c;数组用来管理相同类型的数据。 1 在前面板中创建数组 1.1 创建空数组 在前面板中创建数组时&#xff0c;首先在前面板中点击鼠标右键&#xff0c;弹出“控件”对话框&#xff0c;之后选择“新式->数组、矩阵与簇->数组”&#xff0c;在前面板中…...

Android 10.0 系统systemui下拉通知栏的通知布局相关源码分析

1.前言 在android10.0的系统rom开发中,在进行systemui中的下拉通知栏的布局自定义的时候,对于原生systemui的 系统的下拉通知栏的通知布局的了解也是非常重要的,接下来就来分析下相关的下拉通知栏的通知布局的相关 源码流程,了解这些才方便对通知栏的布局做修改 2.系统…...

研读Rust圣经解析——Rust learn-3(变量与可变性,数据类型)

研读Rust圣经解析——Rust learn-3&#xff08;变量与可变性&#xff0c;数据类型&#xff09; 变量|常量与可变性变量声明案例为什么不可变变量可变&#xff08;mut关键字&#xff09;变量可变&#xff08;覆盖&#xff09; 常量声明 数据类型标量类型整型整型字面值整型溢出问…...

接口的多继承多实现

接口的多继承多实现 目录 接口的多继承多实现多继承&#xff08;接口1 extends 接口2,接口3&#xff09;多实现&#xff08;实现类 实现 接口1&#xff0c;接口2&#xff09;总结1.类与类的关系2.类和接口的关系3.接口与接口的关系 多继承&#xff08;接口1 extends 接口2,接口…...

腾讯-iOS面试题-答案

一面 1、介绍一下实习的项目&#xff0c;任务分工,做了哪些工作&#xff1f;介绍实习内容 2、网络相关的&#xff1a;项目里面使用到什么网络库&#xff0c;用过ASIHTTP库吗 在iOS开发中&#xff0c;常用的网络库包括&#xff1a; URLSession&#xff1a;苹果官方提供的网络…...

SQL Server内存架构

2. 内存架构 所谓内存架构,这里是指SQL Server实例内存管理、使用与相关逻辑设计及实现等方面内容。更具体一点,就是讲SQL Server实例分配、管理和使用其内存空间的内部机制。本书1.1节中我们已经讲过,SQL Server实例包括多个内部机制各不相同的内存区域,在此,我们将讲解…...

有哪些功能强大,但是很小众的Python库呢?

Python生态系统中有很多小众但非常强大的库&#xff0c;一般&#xff0c;通俗的规律就是&#xff0c;越是高端&#xff0c;越小众&#xff0c;但是&#xff0c;高端不代表难学&#xff0c;只要理论到了&#xff0c;用起来照样嗖嗖的&#xff0c;以下是一些参考的高端小众库&…...

SpringBoot设计了哪些可拓展的机制?

SpringBoot核心源码 public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { ...this.primarySources new LinkedHashSet(Arrays.asList(primarySources));// Servletthis.webApplicationType WebApplicationType.deduceFromClass…...

Layer组件多个iframe弹出层打开与关闭及参数传递

Layer官网地址&#xff1a;http://layer.layui.com/ 1、多个iframe弹出层&#xff08;非嵌套&#xff09; 1.打开iframe弹出层js代码 &#xff08;1&#xff09;示例一&#xff1a; content参数可传入要打开的页面&#xff0c;type参数传2&#xff0c;即可打开iframe类型的弹层…...

BearPi环境搭建及基本使用

这是一篇总结&#xff0c;一些坑的记录 具体教程请访问&#xff1a; BearPi-HM_Nano: 小熊派BearPi-HM Nano开发板基于HarmonyOS的源码 - Gitee.com 第一步&#xff1a;安装虚拟机 不做赘述 第二步&#xff1a;下载资源 这里要用到ubuntu的一些基础知识&#xff0c;不会的…...

算法笔记-换根DP

换根DP 一般是给定一棵不定根树&#xff0c;求以每个节点为根的一些信息。可以通过二次扫描&#xff1a; 第一次扫描&#xff0c;任选一点为根&#xff0c;在有根树上&#xff0c;自底向上转移第二次扫描&#xff0c;从上一次扫描的根开始&#xff0c;自顶向下计算 P3478 [P…...

LeetCode 785. Is Graph Bipartite【DFS,二分图】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…...

【微信小程序】-- 分包 - 独立分包 分包预下载(四十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

2.3 连续性随机变量

思维导图&#xff1a; 学习目标&#xff1a; 我会按照以下步骤学习连续型随机变量&#xff1a; 复习概率论的基础知识&#xff0c;包括概率、期望、方差等概念和公式&#xff0c;以及离散型随机变量的概率分布函数和概率质量函数的概念和性质。 学习连续型随机变量的概念和性…...

【DES详解】(一)处理input block(64 bits)

一、DES 加密算法总览 0-1、初识置换 IP&#xff08;Initial Permutation&#xff09; 输入&#xff1a;明文&#xff08;64 bits&#xff09; 过程&#xff1a;初识置换 输出&#xff1a;处理后的明文permuted input&#xff08;64 bits&#xff09; 首先&#xff0c;对需要解…...

redis笔记——三种特殊的数据结构

三种特殊数据类型 geospatial&#xff08;地理位置&#xff09; 用于定位&#xff0c;附近的人&#xff0c;距离计算 添加元素 geoadd key 经度 纬度 描述名称&#xff0c;可一次添加多个元素 127.0.0.1:6379> geoadd china:city 113.28 23.12 guangzhou (integer) 1 1…...

网络安全之编码加密算法

网络安全之编码加密算法 一、ROT5/13/18/47编码转换二、MD5加密 一、ROT5/13/18/47编码转换 ROT5、ROT13、ROT18、ROT47 编码是一种简单的码元位置顺序替换暗码&#xff0c;属于凯撒密码的一种。此类编码具有可逆性&#xff0c;可以自我解密&#xff0c;主要用于应对快速浏览&…...

TikTok GMXMAX广告优化全攻略

在2026年&#xff0c;TikTok广告投放逐渐向自动化模型演进&#xff0c;其中GMX MAX&#xff08;GMV Max&#xff09;成为很多团队用来提升ROI和放量的重要方式。相比传统广告模式&#xff0c;它可以自动完成受众匹配与预算分配&#xff0c;减少大量人工干预。不过在实际操作中&…...

【MATLAB实战:从BCI Competition IV 2a数据加载到预处理全流程】

1. 初识BCI Competition IV 2a数据集 第一次接触脑机接口&#xff08;BCI&#xff09;研究时&#xff0c;最让人头疼的就是数据预处理。BCI Competition IV 2a数据集作为入门级黄金标准&#xff0c;包含了9名受试者的EEG数据&#xff0c;记录了左手、右手、双脚和舌头四种运动想…...

不止于地图:深入QGC地图插件机制,打造你的自定义地图源

不止于地图&#xff1a;深入QGC地图插件机制&#xff0c;打造你的自定义地图源 在无人机地面站软件生态中&#xff0c;QGroundControl&#xff08;QGC&#xff09;以其开源特性和模块化设计&#xff0c;成为开发者扩展定制的首选平台。当我们谈论地图功能时&#xff0c;大多数用…...

从零到一:基于NOAA HYSPLIT的后向轨迹实战绘制与污染溯源分析

1. 认识HYSPLIT与后向轨迹分析 第一次接触HYSPLIT模型时&#xff0c;我也被这个复杂的缩写搞得一头雾水。简单来说&#xff0c;这是美国国家海洋和大气管理局&#xff08;NOAA&#xff09;开发的一款专业大气轨迹分析工具&#xff0c;全称是Hybrid Single Particle Lagrangian …...

YOLOE官版镜像案例分享:文本提示检测自定义物体实战

YOLOE官版镜像案例分享&#xff1a;文本提示检测自定义物体实战 1. 引言&#xff1a;开放词汇表检测的挑战与突破 在传统计算机视觉应用中&#xff0c;目标检测模型往往受限于预定义的类别集合。当需要检测训练数据中未出现的新物体时&#xff0c;开发者不得不重新收集数据、…...

Pixel Dream Workshop 在电商领域的应用:一键生成商品场景图

Pixel Dream Workshop 在电商领域的应用&#xff1a;一键生成商品场景图 1. 电商商品图的痛点与机遇 电商行业有个公开的秘密&#xff1a;商品图片的制作成本往往比想象中高得多。我们曾合作过的一家服装电商&#xff0c;每月仅模特拍摄费用就超过20万元&#xff0c;这还不包…...

不用编译!快速修改Scratch-blocks积木字体的偷懒方法

零编译实战&#xff1a;Scratch-blocks字体调整极简方案 在Scratch 3.0的二次开发过程中&#xff0c;积木字体过小是开发者普遍遇到的痛点。官方移除了字体调节功能后&#xff0c;低分辨率设备上的中文显示尤为模糊。传统解决方案需要配置Python环境并重新编译scratch-blocks库…...

AI净界RMBG-1.4快速上手指南:小白也能轻松搞定透明素材

AI净界RMBG-1.4快速上手指南&#xff1a;小白也能轻松搞定透明素材 1. 为什么你需要这个工具 如果你曾经尝试过用传统软件抠图&#xff0c;一定遇到过这些烦恼&#xff1a;发丝边缘总是有残留背景色、半透明物体抠出来像蒙了一层雾、宠物毛发看起来像被啃过一样参差不齐。AI净…...

【分箱进阶篇】分箱的工程细节:从训练到部署的完整模式

基础篇参考&#xff1a;【分箱基础篇】pandas 分箱双子星&#xff1a;pd.cut 与 pd.qcut ​ 我们在基础篇讲了 pd.cut 和 pd.qcut 各自怎么用。但在实际项目里&#xff0c;分箱不是调一次函数就完事的。通常来说&#xff0c;训练集上算出来的切分点要保存下来&#xff0c;测试集…...

如何快速掌握AI变声神器RVC:面向初学者的完整指南

如何快速掌握AI变声神器RVC&#xff1a;面向初学者的完整指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI 语音数据小于等于10分钟也可以用来训练一个优秀的变声模型&#xff01; 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Con…...