【C++ regex】C++正则表达式

文章目录

  • 前言
  • 一、正则表达式是什么?
  • 二、<regex>库的基础使用
    • 2.1 第一个示例
    • 2.1 <regex>库的函数详解
      • std::regex_match
      • std::regex_search
      • regex_search 和 regex_match 的区别
      • std::regex_replace
      • std::regex_iterator 和 std::sregex_iterator:
      • std::regex_constants::match_flag_type:
  • 总结


前言

正则表达式是一种强大的文本模式匹配工具,它在字符串处理中具有广泛的应用。C++11引入了标准库的 头文件,提供了内置的正则表达式支持,使得在C++中进行字符串匹配和处理变得更为便捷和高效。

在本文中,我们将深入探讨C++中正则表达式的基础知识以及 库的使用方式。我们将介绍正则表达式的基本概念,然后逐步介绍C++中regex库的各种函数及其用法,并通过示例代码演示其实际应用。


一、正则表达式是什么?

正则表达式是一种描述字符模式的方法,它可以用于字符串的搜索、匹配和替换。它是由字符和特殊字符组成的字符串,定义了一种搜索模式。例如,正则表达式可以用于验证电子邮件地址、提取文本中的特定信息等。

二、库的基础使用

2.1 第一个示例

C++的 头文件引入了正则表达式的支持,其中包括了 std::regex 类以及一系列与正则表达式相关的函数。下面是一个简单的基础使用例子:

#include <iostream>
#include <regex>int main() {std::string text = "Hello, World!";// 定义正则表达式模式std::regex pattern("W[a-z]+");// 使用 std::regex_search 进行匹配if (std::regex_search(text, pattern)) {std::cout << "Pattern found in the text." << std::endl;} else {std::cout << "Pattern not found in the text." << std::endl;}return 0;
}

在这里插入图片描述

regex 的构造函数参数为你要匹配的规则
regex_search函数参数1是你输入的字符,参数二是匹配模式,返回值为是否找到,true/false

在上面的例子中,我们使用 std::regex 类定义了一个正则表达式模式,并使用 std::regex_search 函数在字符串中进行匹配。

2.1 库的函数详解

std::regex_match

函数原型:

template <class BiIter, class Alloc, class CharT, class Traits>
bool regex_match(BiIter first, BiIter last, std::match_results<BiIter, Alloc>& m, const std::basic_regex<CharT, Traits>& e, std::regex_constants::match_flag_type flags = std::regex_constants::match_default);

参数:

first,last:迭代器范围,指定要搜索的字符串。
m:用于存储匹配结果的 std::match_results 对象。
std::smatch 是 C++ 标准库中与正则表达式匹配结果相关的类型之一。它是 std::match_results 模板类的一个特化版本,用于存储正则表达式的匹配结果。具体来说,std::smatch 用于存储字符串中与正则表达式匹配的子字符串的信息。

在正则表达式的匹配过程中,std::smatch 对象可以捕获并保存匹配的子字符串及其位置信息。这样的对象通常是由正则表达式搜索函数(如 std::regex_search)的参数之一,用于获取匹配的详细信息。

e:要匹配的正则表达式对象。
flags:匹配标志,控制匹配的方式。
返回值:

如果整个范围匹配正则表达式,则返回 true,否则返回 false。
示例代码:

std::string input = "12345";
std::regex pattern("\\d+");std::smatch matches;
if (std::regex_match(input, matches, pattern)) {std::cout << "Input is a number." << std::endl;
} else {std::cout << "Input is not a number." << std::endl;
}

在这里插入图片描述

std::regex_search

函数原型:

template <class BiIter, class Alloc, class CharT, class Traits>
bool regex_search(BiIter first, BiIter last, std::match_results<BiIter, Alloc>& m, const std::basic_regex<CharT, Traits>& e, std::regex_constants::match_flag_type flags = std::regex_constants::match_default);

参数:

first,last:迭代器范围,指定要搜索的字符串。
m:用于存储匹配结果的 std::match_results 对象。
e:要匹配的正则表达式对象。
flags:匹配标志,控制匹配的方式。
返回值:

如果字符串中的任何部分匹配正则表达式,则返回 true,否则返回 false。
示例代码:

std::string text = "The cat is on the mat.";
std::regex pattern("cat");std::smatch matches;
if (std::regex_search(text, matches, pattern)) {std::cout << "Pattern found in the text." << std::endl;
} else {std::cout << "Pattern not found in the text." << std::endl;
}

在这里插入图片描述

regex_search 和 regex_match 的区别

std::regex_search 和 std::regex_match 是 C++ 标准库中用于正则表达式匹配的两个函数,它们之间有一些重要的区别:

全文匹配 vs. 部分匹配:

std::regex_match 要求整个输入字符串完全匹配正则表达式。如果整个字符串与正则表达式匹配,它返回 true;否则,返回 false。
std::regex_search 则在输入字符串中查找任意匹配项。只要找到字符串中的任意子串与正则表达式匹配,就返回 true;否则,返回 false。
匹配的起始位置:

std::regex_match 从字符串的起始位置开始匹配,直到整个字符串结束。如果正则表达式没有匹配整个字符串,它返回 false。
std::regex_search 可以在字符串的任意位置找到匹配项。它会尝试在整个字符串中查找匹配,而不仅仅是从起始位置开始。
下面是一个简单的例子来说明它们之间的区别:

#include <iostream>
#include <regex>int main() {std::string text = "Hello world";// 正则表达式匹配整个字符串std::regex pattern_match("Hello world");std::regex pattern_search("world");// 使用 std::regex_matchif (std::regex_match(text, pattern_match)) {std::cout << "regex_match: Entire string matches." << std::endl;} else {std::cout << "regex_match: Entire string does not match." << std::endl;}// 使用 std::regex_searchif (std::regex_search(text, pattern_search)) {std::cout << "regex_search: Substring found." << std::endl;} else {std::cout << "regex_search: Substring not found." << std::endl;}return 0;
}

在这里插入图片描述

在这个例子中,std::regex_match 尝试匹配整个字符串,而 std::regex_search 只需找到字符串中的任意子串与正则表达式匹配即可。

std::regex_replace

功能:用于替换字符串中与正则表达式匹配的部分。

示例:

#include <iostream>
#include <regex>int main() {std::string text = "The price is $10.50";std::regex pattern("\\$[0-9]+\\.[0-9]{2}");std::string result = std::regex_replace(text, pattern, "*****");std::cout << "Modified string: " << result << std::endl;return 0;
}

在这里插入图片描述

std::regex_iterator 和 std::sregex_iterator:

功能:允许你迭代遍历一个字符串中所有匹配正则表达式的子串。

示例:

#include <iostream>
#include <regex>int main() {std::string text = "The cat and the hat";std::regex pattern("\\b\\w+at\\b");std::sregex_iterator iter(text.begin(), text.end(), pattern);std::sregex_iterator end;while (iter != end) {std::cout << "Match: " << iter->str() << std::endl;++iter;}return 0;
}

在这里插入图片描述

std::regex_constants::match_flag_type:

功能:提供了一些匹配标志,例如 std::regex_constants::match_default 和 std::regex_constants::match_not_bol,可用于修改匹配的行为。

示例:

#include <iostream>
#include <regex>int main() {std::string text = "apple orange banana";std::regex pattern("orange");// 使用 match_not_bol 避免从行首开始匹配std::regex_constants::match_flag_type flags = std::regex_constants::match_not_bol;if (std::regex_search(text, pattern, flags)) {std::cout << "Substring found." << std::endl;} else {std::cout << "Substring not found." << std::endl;}return 0;
}

在这里插入图片描述

这些函数和特性可以帮助你更灵活地处理正则表达式,适应不同的匹配和替换需求。请注意,正则表达式的语法和使用可能因实际需求而有所不同。


总结

C++的 库为处理正则表达式提供了强大的工具。通过学习和理解正则表达式的基础知识以及regex库的函数,我们能够更加高效地在字符串中进行搜索、匹配和替换操作。不同的正则表达式函数提供了灵活的方式来满足不同的匹配需求,而对于更复杂的模式匹配,我们可以利用具体的匹配结果对象进行更深入的分析和处理。正则表达式在文本处理领域有着广泛的应用,掌握这一部分知识将对C++开发者有着重要的意义。

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

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

相关文章

MacBook Pro 安装Nacos【超详细图解】

目录 一、安装Nacos 二、启动nacos 三、进入可视化界面 因项目用到nacos&#xff0c;所以需要装一个&#xff0c;顺便写篇文章记录 一、安装Nacos 前往官网下载&#xff1a;Nacos官网homehttps://nacos.io/zh-cn/ # 解压 unzip nacos-server-2.3.0.zip 二、启动nacos …

Collection集合的遍历方式-迭代器,增强for循环,Lambda

集合体系概述 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的 public class Work1 {public static void main(String[] args) {//简单认识一下Collection集合的特点ArrayList<String> list new ArrayList&…

【Vue2】Vue的介绍与Vue的第一个实例

文章目录 前言一、为什么要学习Vue二、什么是Vue1.什么是构建用户界面2.什么是渐进式Vue的两种开发方式&#xff1a; 3.什么是框架 三、创建Vue实例四、插值表达式 {{}}1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中2.语法3.错误用法 五、响应式特性1.什么是响…

mysql中删除数据后,新增数据时id会跳跃,主键自增id不连续

引言&#xff1a; 在使用MySQL数据库时&#xff0c;有时候我们需要删除某些记录&#xff0c;但是删除记录后可能会导致表中的id不再连续排序。 如何实现删除记录后让id重新排序的功能。 如图&#xff1a; 删除数据后&#xff0c;中间的id不会自动连续。 下面有两种方法进行重…

医院绩效系统源码:基础数据管理、核算方法和分配规则、KPI评分公式等功能

医院绩效管理系统源码&#xff0c;医院绩效管理数据采集的自动化和绩效评估数字化 医院绩效管理系统以国家医院绩效管理考核政策法规为依据&#xff0c;结合医院管理实践&#xff0c;以经济管理指标为核心&#xff0c;医疗质量、安全、效率、效益管理为重点&#xff0c;特别强调…

unity3d模型中缺失animation

在 模型的Rig-Animationtype 设置成Legacy https://tieba.baidu.com/p/2293580178

OWASP SAMM 软件保障成熟度模型

软件保障成熟度模型 我们的使命是为您提供一种有效且可衡量的方式来分析和改进您的安全开发生命周期。 SAMM 支持完整的软件生命周期&#xff0c;并且与技术和流程无关。我们构建的 SAMM 本质上是不断发展和风险驱动的&#xff0c;因为没有一种单一的配方适用于所有组织。奥瓦…

JVM——垃圾回收器(G1,JDK9默认为G1垃圾回收器)

1.G1垃圾回收器 JDK9之后默认的垃圾回收器是G1&#xff08;Garbage First&#xff09;垃圾回收器。 Parallel Scavenge关注吞吐量&#xff0c;允许用户设置最大暂停时间 &#xff0c;但是会减少年轻代可用空间的大小。 CMS关注暂停时间&#xff0c;但是吞吐量方面会下降。 而G1…

【C语言】扫雷小游戏初学者版

成功的秘诀就是每天都比别人多努力一点。 今天给大家带来一款非常经典的小游戏——扫雷的实现和讲解 这里是目录 前言整体框架1.打印菜单2.创建二维数组3.初始化棋盘4.打印棋盘5.布置棋盘中的雷6.排查雷和统计雷总体代码test.cgame.cgame.h 进阶&#xff08;递归展开&#xff0…

CityEngine2023 shp数据城市与路网三维模型并导入UE5

目录 0 引言1 城市和道路数据获取1.1 常用方法1.2 OSM数据获取1.3 OSM数据格式1.3.1 所有格式1.3.2 Shapefile格式 2 实践2.1 导入数据&#xff08;.shp&#xff09;2.2 构建三维模型2.3 将模型导入UE5 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xf…

手机传输数据到电脑该怎么操作?安卓、苹果都可以这样操作

安卓手机 你知道安卓手机传输数据到电脑的方法有哪些吗&#xff1f;下面我们就一起来看一看可以使用的一些方法。 采用 USB 数据线 这个方法应该是我们生活中较为常见的方法了&#xff0c;我们只需要使用手机的充电线&#xff0c;将其连接到电脑上&#xff0c;然后手机可能会…

Motion Plan之轨迹生成笔记 (2)

Motion Plan之搜索算法笔记 Motion Plan之基于采样的路径规划算法笔记 Motion Plan之带动力学约束路径搜索 什么是基于优化的轨迹生成 Optimization-Based Trajectory Planning&#xff08;基于优化的轨迹规划&#xff09;是一种常用的方法&#xff0c;用于生成自动化系统&am…

2.4 API 开发和集成

文章目录 API 开发和集成API 的概念和作用API 开发基础API 集成API 鉴权和安全API 文档和测试微服务和 API 网关云服务和 API 集成未来趋势和发展实验实验一&#xff1a; 通过api post方式传入 json实验二&#xff1a;通过api将所需数据传入 API 开发和集成 API 的概念和作用介…

StarRocks上新,“One Data、All Analytics”还有多远?

K.K在《未来十二大趋势》中认为&#xff0c;我们正处于一个数据流动的时代。商业乃数据之商业。归根结底&#xff0c;你在处理的都是数据。 的确&#xff0c;当数据成为新的核心生产要素之际&#xff0c;数据分析就犹如最重要的生产工具之一&#xff0c;决定着企业在数字化时代…

Python爬虫超详细讲解(零基础入门,包教包会)

先看后赞&#xff0c;养成习惯。 点赞收藏&#xff0c;人生辉煌。 讲解我们的爬虫之前&#xff0c;先概述关于爬虫的简单概念&#xff08;毕竟是零基础教程&#xff09; 爬虫 网络爬虫&#xff08;又被称为网页蜘蛛&#xff0c;网络机器人&#xff09;就是模拟浏览器发送网络…

【Avue】select的远程搜索 [模糊搜索]

一、需求 【模糊搜索】 二、实现avue的远程搜索 1、search为搜索 2、remote远程搜索 3、dictValue{{key}}为输入的值

数实融合!低代码推动工业数字化转型走“深”向“实”

当下&#xff0c;“数字化、智能化”已经不再是新鲜词。毕竟&#xff0c;在早几年前就已经有企业喊出大举进军数字化的口号&#xff0c;轰轰烈烈的数字化转型运动也持续了很长一段时间&#xff0c;有一些业内人士甚至判断“如今的企业数字化已经走过了成熟期&#xff0c;来到了…

使用群晖Docker搭建HomeAssistant并实现异地公网访问家中智能设备

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 使用群晖Docker搭建HomeAssistant并实现异地公网访问 文章目录 使…

Shopee买家通系统内置防指纹技术可解决多账号管理操作

为了解决多账号管理的难题&#xff0c;我们发现了一款强大的利器——Shopee买家通系统&#xff0c;它为我们提供了便捷而高效的辅助操作。这款系统基于先进的指纹浏览器技术开发&#xff0c;实现了全自动化的操作&#xff0c;让多账号管理变得轻而易举。 Shopee买家通系统内置了…

element-ui upload组件中将file文件数据转成二进制流数据格式

方法一 handleBeforeUpload (file)const reader new FileReader()reader.readAsArrayBuffer(file)reader.onload async function (theFile) {const binary new Blob([theFile.target.result]) // 转成二进制流数据 即binary数据格式}}方法二 const aBlob new Blob([file],…