当前位置: 首页 > 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;主要用于应对快速浏览&…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...