(C++进阶)正则表达式

目录

一、概念

1、简介

2、字符规则

二、常用函数

1、std::regex_match

2、std::regex_search

3、std::regex_replace

三、std::smatch


一、概念

1、简介

正则表达式(Regular Expression),通常简写为RegExp或Regex是一种用于匹配字符串模式的强大工具。它由一系列字符和特殊符号组成,用于定义匹配模式。正则表达式在文本处理、数据验证、搜索和替换等领域有广泛的应用。

2、字符规则

C++11引入了正则表达式支持,允许使用正则表达式模式来操作和处理字符串。

1. 基本字符匹配:
    `\d`:匹配任何数字字符,等同于 `[0-9]`。
    `\D`:匹配任何非数字字符,等同于 `[^0-9]`。
    `\w`:匹配任何字母、数字或下划线字符。
    `\W`:匹配任何非字母、非数字、非下划线字符。
    `\s`:匹配任何空白字符,包括空格、制表符、换行符等。
    `\S`:匹配任何非空白字符。

2. 自定义字符集合:
    `[...]`:用方括号括起来的字符集合,匹配其中的任何一个字符。例如,`[aeiou]` 匹配任何元音字母。

3. 量词:
    `*`:匹配前一个元素零次或多次。
    `+`:匹配前一个元素一次或多次。
    `?`:匹配前一个元素零次或一次。
    `{n}`:匹配前一个元素恰好 n 次。
    `{n,}`:匹配前一个元素至少 n 次。
    `{n,m}`:匹配前一个元素 n 到 m 次。

4. 位置锚定:
    `^`:匹配字符串的开头。
    `$`:匹配字符串的结尾。
    `\b`:匹配单词边界。

5. 分组和捕获:
    `(...)`:用小括号来创建一个捕获组,可以提取匹配的内容。

6. 转义字符:
    `\`:用于转义具有特殊含义的字符,以匹配它们本身。例如,`\.` 匹配句点字符 `.`。

7. | 操作符:
    `|`:用于创建逻辑或操作,可以匹配多个选择之一。例如,`cat|dog` 匹配 "cat" 或 "dog"。

8. 标志:
    正则表达式可以附带一些标志,例如 `std::regex::icase` 用于进行不区分大小写的匹配。

二、常用函数

1、std::regex_match

`std::regex_match` 是C++标准库中用于执行完全匹配的正则表达式函数。它用于判断一个字符串是否完全与给定的正则表达式模式匹配。

下面是 `std::regex_match` 的语法和示例:

#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "42";std::regex pattern(R"(\d+)");if (std::regex_match(text, pattern)) {std::cout << "Valid integer." << std::endl;} else {std::cout << "Not a valid integer." << std::endl;}return 0;
}

有一个字符串 `text`,定义了一个正则表达式模式 `pattern`,该模式用于匹配一个或多个数字。使用 `std::regex_match` 函数将 `text` 与 `pattern` 进行比较,以判断是否完全匹配。

如果字符串 `text` 完全匹配正则表达式模式 `pattern`,则条件成立。

`std::regex_match` 只在整个字符串中查找匹配,如果整个字符串与模式匹配,则返回 `true`,否则返回 `false`。

这是一种用于验证字符串是否完全符合给定模式的方法,非常适用于数据验证和输入检查。

`std::regex_search` 是C++标准库中用于在字符串中搜索匹配的正则表达式模式的函数。与 `std::regex_match` 不同,`std::regex_search` 用于查找字符串中的部分匹配,而不是要求整个字符串完全匹配。

以下是 `std::regex_search` 的语法和示例:

#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "Contact us at info@example.com or support@test.org for assistance.";std::regex pattern(R"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b)");std::smatch matches;while (std::regex_search(text, matches, pattern)) {std::cout << "Found email: " << matches[0] << std::endl;text = matches.suffix();}return 0;
}

一个包含多个电子邮件地址的字符串 `text`,一个正则表达式模式 `pattern`,该模式用于匹配电子邮件地址。

使用 `std::regex_search` 函数,我们在 `text` 中搜索匹配模式 `pattern` 的内容。当找到匹配时,`std::regex_search` 返回 `true`,并将匹配的内容存储在 `std::smatch` 对象 `matches` 中。

在循环中,我们打印出每次找到的电子邮件地址,并使用 `matches.suffix()` 移动字符串的位置,以便在下次迭代中找到下一个匹配。

`std::regex_search` 通常用于搜索包含多个匹配项的字符串,而不仅仅是验证是否存在匹配。这对于文本分析、提取数据和搜索引擎等应用非常有用。

3、std::regex_replace

`std::regex_replace` 是C++标准库中的函数,用于替换字符串中与正则表达式模式匹配的部分。允许将匹配的文本替换为指定的内容。

下面是关于 `std::regex_replace` 的示例和说明:

#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "The color of the sky is blue, and the ocean is also blue.";std::regex pattern("blue");std::string replacement = "green";std::string result = std::regex_replace(text, pattern, replacement);std::cout << "Replaced text: " << result << std::endl;return 0;
}

一个字符串 `text`,并定义了一个正则表达式模式 `pattern`,该模式匹配单词 "blue"。将所有匹配的 "blue" 替换为 "green"。

使用 `std::regex_replace` 函数,将 `text` 中与模式 `pattern` 匹配的部分替换为指定的 `replacement`,然后将结果存储在 `result` 变量中。"blue" 被替换为 "green"。

`std::regex_replace` 是非常有用的,特别是在文本处理中,用于进行替换操作。可以根据需要创建不同的正则表达式模式和替换内容,以实现各种文本替换需求。

三、std::smatch

`std::smatch` 是C++标准库中的一个类,用于存储正则表达式的匹配结果它通常用于捕获、存储和访问正则表达式中的匹配子串。

下面是关于 `std::smatch` 的示例和说明:

#include <iostream>
#include <regex>
#include <string>int main() {std::string text = "My phone number is (123) 456-7890.";std::regex pattern(R"(\(\d{3}\) \d{3}-\d{4})");std::smatch matches;if (std::regex_search(text, matches, pattern)) {std::cout << "Match found: " << matches[0] << std::endl;std::cout << "Capture group 1: " << matches[1] << std::endl;} else {std::cout << "No match found." << std::endl;}return 0;
}

使用 `std::smatch` 存储正则表达式模式的匹配结果。正则表达式模式 `(\(\d{3}\) \d{3}-\d{4})` 用于匹配电话号码,并使用小括号 `()` 创建一个捕获组,以便捕获电话号码的不同部分。

在 `std::regex_search` 的调用中,`matches` 用于存储匹配结果。当匹配成功时,`matches[0]` 包含整个匹配的字符串,而 `matches[1]` 包含捕获组 1 中的内容,即电话号码的部分。

`std::smatch` 可以用于存储多个匹配结果,如果正则表达式中有多个捕获组,每个组的内容都可以通过 `matches` 数组来访问。这使得在处理文本数据时,能够轻松提取和操作匹配的部分。

`std::smatch` 类是C++中处理正则表达式的有用工具,特别适合用于从文本中提取和处理特定模式的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/171942.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决:谷歌浏览器访问http时,自动转https访问的问题

问题背景&#xff1a;某个系统网站&#xff0c;之前一直用https域名访问&#xff0c;现在改成http域名后&#xff0c;用http访问&#xff0c;谷歌浏览器会自动跳转到https。 解决方法&#xff1a; 在浏览器中输入网址&#xff1a;chrome://net-internals/#hsts -》 在“Delete…

Jmeter压测实战:Jmeter二次开发之自定义函数

​1 前言 Jmeter是Apache基金会下的一款应用场景非常广的压力测试工具&#xff0c;具备轻量、高扩展性、分布式等特性。Jmeter已支持实现随机数、计数器、时间戳、大小写转换、属性校验等多种函数&#xff0c;方便使用人员使用。如果在使用过程中存在和业务强耦合的常用功能函…

【广州华锐互动】VR公司工厂消防逃生演练带来沉浸式的互动体验

在工业生产过程中&#xff0c;安全问题始终是我们不能忽视的重要环节。特别是火灾事故&#xff0c;不仅会造成重大的经济损失&#xff0c;更会威胁到员工的生命安全。传统的消防安全训练方法&#xff0c;如讲座、实地演练等&#xff0c;虽然具有一定的效果&#xff0c;但是无法…

Matlab绘制散点的95%置信区间图

Matlab常绘制95%置信区间图&#xff0c;主要使用到patch函数。 如果直接使用散点进行拟合&#xff0c;在patch函数绘制95%置信区间时&#xff0c;会绘制的很乱&#xff0c;这个是由于patch函数所导致的&#xff0c;其实这个问题在 Matlab绘制95%置信区间图 中已经讲到过&#…

【教3妹学编程-java实战4】Map遍历删除元素的几种方法

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 2哥 :3妹&#xff0c;今天是周末&#xff0c;又不用上…

51单片机复位电容计算与分析(附带Proteus电路图)

因为iC x (dU/dt).在上电瞬间&#xff0c;U从0变化到U,所以这一瞬间就是通的&#xff0c;然后这就是一个直流回路&#xff0c;因为电容C直流中是断路的&#xff0c;所以就不通了。 然后来分析一下这个电容的电压到底是能不能达到单片机需要的复位电压。 这是一个线性电容&…

基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现休闲娱乐代理售票平台系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把休闲娱乐代理售票管理与现在网络相结合&#xff0c;利用java技术建设休闲娱乐代理售票系统&#xff0c;实现休闲娱乐代理售票的信息化。则对于进一步提高休闲娱乐代理售票管…

【黑产攻防道03】利用JS参数更新检测黑产的协议破解

任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验&#xff0c;将黑产的破解方式分为三类&#xff1a; 1.通过识别出验证码图片答案实现批量破解验证&#xff0c;即图片…

SQL-正则表达式和约束

文章目录 主要内容一.正则表达式1.操作1代码如下&#xff08;示例&#xff09;: 2.操作2代码如下&#xff08;示例&#xff09;: 3.操作3代码如下&#xff08;示例&#xff09;: 4.操作4代码如下&#xff08;示例&#xff09;: 二.约束1.主键约束 2.自增长约束3.非空约束4.唯一…

CSDN学院 < 华为战略方法论进阶课 > 正式上线!

目录 你将收获 适用人群 课程内容 内容目录 CSDN学院 作者简介 你将收获 提升职场技能提升战略规划的能力实现多元化发展综合能力进阶 适用人群 主要适合公司中高层、创业者、产品经理、咨询顾问&#xff0c;以及致力于改变现状的学员。 课程内容 本期课程主要介绍华为…

网络原理的讲解

网络原理 重要性: 网络原理知识 1.工作中非常重要的理论知识,尤其是正在调试一些bug的时候. 2.面试中非常重要的考点. 3.学习中非常关键的难点. 网络原理这里,主要给大家介绍, TCP/IP协议 这里的关键协议. 按照这里的这四层,分别进行介绍(物理层不涉及) 应用层 是和程序猿打…

ubuntu 安装 gnome 安装 xrdp

先安装xrdp 更新 apt-get sudo apt-get update && apt-get upgrade安装图形包 apt-get install xubuntu-desktop安装 xrdp apt-get install xrdp安装 xfce4 apt-get install xfce4配置 xfce4 Add xfce to the xfce desktop window manager autorun by fixing the …

栈、队列、矩阵的总结

栈的应用 括号匹配 表达式求值&#xff08;中缀&#xff0c;后缀&#xff09; 中缀转后缀&#xff08;机算&#xff09; 中缀机算 后缀机算 总结 特殊矩阵 对称矩阵的压缩存储 三角矩阵 三对角矩阵 稀疏矩阵的压缩存储

如何在vscode中添加less插件

Less &#xff08;Leaner Style Sheets 的缩写&#xff09; 是一门向后兼容的 CSS 扩展语言。它对CSS 语言增加了少许方便的扩展&#xff0c;通过less可以编写更少的代码实现更强大的样式。但less不是css&#xff0c;浏览器不能直接识别&#xff0c;即浏览器无法执行less代码&a…

基于springboot实现休闲娱乐代理售票平台系统项目【项目源码+论文说明】

基于springboot实现休闲娱乐代理售票系统演示 摘要 网络的广泛应用给生活带来了十分的便利。所以把休闲娱乐代理售票管理与现在网络相结合&#xff0c;利用java技术建设休闲娱乐代理售票系统&#xff0c;实现休闲娱乐代理售票的信息化。则对于进一步提高休闲娱乐代理售票管理发…

【疑问解决】在自动装箱中Integer赋予一个常量1,为什么会出现==判断true和flase的情况(JDK源码、内部缓冲)

问题来源自讲课时的Integer练习中 当时第一反应是false true true 因为第一段的输出为flase毋庸置疑了&#xff0c;因为已经new了两个新的堆空间&#xff0c;当然指向不同的空间了 但是第二段第三段就没有头绪了&#xff0c;自动装箱了难道不是执行同一个空间吗…

【Linux】安装配置虚拟机及虚拟机操作系统的安装

一. 操作系统和内核 关于操作系统是这样定义的&#xff1a; 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理如管理与配…

云计算未来展望:边缘计算、量子计算与AI

文章目录 边缘计算&#xff1a;数据处理的新时代应用领域挑战与机遇 量子计算&#xff1a;超越传统计算的新范式量子比特应用前景挑战与机遇 人工智能&#xff1a;云计算的动力云中的AI应用领域挑战与机遇 结语 &#x1f389;欢迎来到云计算技术应用专栏~云计算未来展望&#x…

Xray的简单使用

xray 简介 xray 是一款功能强大的安全评估工具&#xff0c;由多名经验丰富的一线安全从业者呕心打造而成&#xff0c;主要特性有: 检测速度快。发包速度快; 漏洞检测算法效率高。支持范围广。大至 OWASP Top 10 通用漏洞检测&#xff0c;小至各种 CMS 框架 POC&#xff0c;均…

JAVA实现智能停车场管理系统 开源

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容A. 车主端功能B. 停车工作人员功能C. 系统管理员功能1. 停车位模块2. 车辆模块3. 停车记录模块4. IC卡模块5. IC卡挂失模块 三、界面展示3.1 登录注册3.2 车辆模块3.3 停车位模块3.4 停车数据模块3.5 IC卡档案模块3.6 IC卡挂…