(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.mzph.cn/news/121698.shtml

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

相关文章

装了mac os 14.0 sonoma 在腾讯会议投屏时候,无法设置麦克风权限问题

愿意&#xff1a;界面上直接空白的&#xff0c;无法手动或自动弹出要配置授权的软件 解决思路&#xff1a; 给 TCC.db 增加1条权限记录 添加到数据库里 /usr/bin/sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db "INSERT INTO main.access (service, cli…

windows PC virtualBox 配置

效果&#xff1a; oracle vitualbox 可以访问通PC主机&#xff0c;可以访问外网: 注意&#xff0c;如果docker0网络地址&#xff0c;和PC主机的网络地址冲突了&#xff0c;需要变更docker的网络地址&#xff1a; root/home/mysqlPcap/anti-tamper $ cat /etc/docker/daemon.js…

YOLOv5算法改进(21)— 添加CA注意力机制 + 更换Neck网络之BiFPN + 更换损失函数之EIoU

前言:Hello大家好,我是小哥谈。通过上节课的学习,相信同学们一定了解了组合改进的核心。本节课开始,就让我们结合论文来对YOLOv5进行组合改进(添加CA注意力机制+更换Neck网络之BiFPN+更换损失函数之EIoU),希望同学们学完本节课可以有所启迪,并且后期可以自行进行YOLOv5…

GPT与创作:革命性的合作还是失业的噩梦?

作为一个从事互联网行业的从业者&#xff0c;我经常听到关于GPT的争议性言论。百度的​1​、CSDN的​2​&#xff0c;以及各种AI助手&#xff0c;这些工具在创作领域掀起了一场革命。但是&#xff0c;人们担心广泛使用GPT是否会导致人们失业&#xff0c;甚至挑战互联网公司的存…

【MySQL数据库重点】第二节:MySQL基础知识(基本操作)

目录 一&#xff1a;数据库的操作 1.显示数据库 2.创建数据库 3.使用数据库 4.删除数据库 二&#xff1a;常用数据类型 1.数值类型&#xff1a;整型和浮点型 2.字符串类型 3.日期类型 三&#xff1a;表的操作 1.查看表结构 2.创建表 3.删除表 一&#xff1a;数据库…

wait和sleep是否会触发锁的释放以及 CPU 资源的释放?

wait和sleep Object.wait()方法&#xff0c;会释放锁资源以及 CPU 资源。 Thread.sleep()方法&#xff0c;不会释放锁资源&#xff0c;但是会释放 CPU 资源。 wait 方法 wait()方法是让一个线程进入到阻塞状态&#xff0c;而这个方法必须要写在一个Synchronized 同步代码块里面…

Dubbo 路由及负载均衡性能优化

作者&#xff1a;vivo 互联网中间件团队- Wang Xiaochuang 本文主要介绍在vivo内部针对Dubbo路由模块及负载均衡的一些优化手段&#xff0c;主要是异步化缓存&#xff0c;可减少在RPC调用过程中路由及负载均衡的CPU消耗&#xff0c;极大提升调用效率。 一、概要 vivo内部Java…

工厂干洗店洗鞋店系统,校园洗护小程序来了

洗鞋店小程序&#xff0c;干洗店软件&#xff0c;洗护行业小程序,上门取衣小程序,预约干洗小程序,校园干洗店小程序,工厂干洗店小程序,干洗店小程序开发&#xff0c;成品软件开发 洗衣工厂软件、功能强大&#xff01; 包含以下主要功能&#xff1a; * 用户选择洗护用品&#x…

OS的Alarm定时器调度机制

调度表触发的任务在编译时就被静态定义&#xff0c;任务的触发时间和执行顺序是固定的。这种方式适用于已知的、固定的任务触发模式&#xff0c;例如周期性任务或事件驱动任务。而使用 Alarm 机制触发的任务具有更大的灵活性。Alarm 允许在运行时动态地设置和修改任务的触发时间…

计算机网络--第一次作业

1、比较电路交换、报文交换和分组报文交换优缺点 电路交换 电路交换是以电路连接为目的的交换方式&#xff0c;通信之前要在通信双方之间建立一条被双方独占的物理通道&#xff08;由通信双方之间的交换设备和链路逐段连接而成&#xff09;。 优点&#xff1a; ①由于通信线路为…

薛定谔的猫重出江湖?法国初创公司AliceBob研发猫态量子比特

总部位于巴黎的初创公司Alice&Bob使用超导芯片的两个相反的量子态&#xff08;他们称之为“猫态量子比特”芯片&#xff09;来帮助开发量子计算的不同自旋方式。&#xff08;图片来源&#xff1a;网络&#xff09; 有的人认为&#xff0c;构建量子计算机的模块模仿了著名的…

链动2+1全新9.0版本 无限链动收益

一个平台能否长期存活取决于它是否有一个支撑其持续发展的商业模式。蜂群精选深谙用户心理&#xff0c;对链动21模式进行改造&#xff0c;创新出一种同时具备裂变能力和高效吸引用户留存的新玩法。 链动21模式在整个架构上都是完整的&#xff0c;可以说是一个非常出色的营销模式…

ruoyi-plus创建模块、自动生成代码

ruoyi-plus自动生成代码 1、创建模块 复制其他部分的resouce过来 修改yml文件 2 修改Nacos 2.1 修改数据库文件 复制其他数据库的链接 &#xff0c;改为自己新建的数据库名字 修改为自己要生成的数据库 新建数据库的yaml文件 3 重启docker的ruoyi-gen服务 docker re…

新手向:如何考虑将数据库技术和大数据框架结合使用?

结合的意义/应用场景与功能分摊 结合场景 大规模数据处理&#xff1a;当数据量巨大&#xff0c;超出传统数据库的处理能力时&#xff0c;大数据框架可以高效地处理这些数据&#xff0c;而传统数据库可以为应用程序提供实时或交互式查询。 混合工作负载&#xff1a;企业通常需…

ClickHouse快速了解

简介 ClickHouse是一个开源列式数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;用于在线分析处理&#xff08;OLAP&#xff09;&#xff1a; 列式存储&#xff1a;与传统的行式数据库不同&#xff0c;ClickHouse以列的形式存储数据&#xff0c;这使得在分析大量数据时…

敏感词过滤--golang

目录 1. 建立敏感词数据库表2. 定时任务&#xff0c;读数据并建立敏感词树2.1 开启定时任务2.2 读数据并建立敏感词树 3. 使用 思路&#xff1a; 将敏感词都存到数据库表中定时读取数据到内存中&#xff0c;构建敏感词前缀树写工具方法&#xff0c;使用内存中的前缀树判断消息…

docker - DockerFile 编写 指令

文章目录 前言docker - DockerFile 编写 指令1. FROM2. MAINTAINER3. RUN4. CMD5. LABEL6. EXPOSE7. ENV8. ADD9. COPY10. ENTRYPOINT11. VOLUME12. USER13. WORKDIR14. ARG15. ONBUILD16. STOPSIGNAL 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&am…

解决Windows出现找不到mfcm90u.dll无法打开软件程序的方法

今天&#xff0c;我非常荣幸能够在这里与大家分享关于mfc90u.dll丢失的5种解决方法。在我们日常使用电脑的过程中&#xff0c;可能会遇到一些软件或系统错误&#xff0c;其中之一就是mfc90u.dll丢失。那么&#xff0c;mfc90u.dll究竟是什么文件呢&#xff1f;接下来&#xff0c…

Hbase基本使用,读写原理,性能优化学习

文章目录 HBase简介HBase定义HBase数据模型**HBase** **逻辑结构****HBase** **物理存储结构****HBase** **基本架构** HBase 入门**HBase** **安装部署****HBase** 配置文件**HBase** 启动停止**HBase** **访问页面****HBase** **高可用****HBase Shell****HBase API**HBaseCo…

centos ubantu IP一直变化,远程连接不上问题

文章目录 一、为什么IP地址会变1.主机DHCP导致 二、解决IP地址变化1.centos2.ubantu 总结 虚拟机能连接为互联网,但下一次启动IP地址再发生变化,无法使用ssh远程连接 一、为什么IP地址会变 1.主机DHCP导致 虚拟机系统(ubantu,centos…)启动后会向本地申请IP地址租约,租聘的I…