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

news2025/1/16 7:52:31

文章目录

  • 前言
  • 一、正则表达式是什么?
  • 二、<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_match
    if (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_search
    if (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.coloradmin.cn/o/1281139.html

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

相关文章

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序报错的解决办法

当在本地计算机上使用Microsoft Office相关库时&#xff0c;可能会出现“未在本地计算机上注册microsoft.ACE.oledb.12.0”提供程序的报错。这是由于缺少相关的驱动程序或者未安装相应的软件所导致的。下面是解决该问题的完整攻略。 可能是因为没有安装数据访问组件&#xff0…

LeetCode(51)简化路径【栈】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 简化路径 1.题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff…

Go 程序编译过程(基于 Go1.21)

版本说明 Go 1.21 官方文档 Go 语言官方文档详细阐述了 Go 语言编译器的具体执行过程&#xff0c;Go1.21 版本可以看这个&#xff1a;https://github.com/golang/go/tree/release-branch.go1.21/src/cmd/compile 大致过程如下&#xff1a; 解析 (cmd/compile/internal/synt…

【文献阅读笔记】基于自监督的异常检测和定位:SSM

2022 IEEE TRANSACTIONS ON MULTIMEDIA 领域&#xff1a;异常检测 目标&#xff1a;图像输入数据 文章目录 1、模型2、方法2.1、random masking2.2、restoration network2.3、损失函数2.4、推理时的渐进细化 3、实验4、引用5、想法 1、模型 训练&#xff1a; 每个图像实时生成随…

时间复杂度为O (nlogn)的排序算法

归并排序 归并排序遵循分治的思想&#xff1a;将原问题分解为几个规模较小但类似于原问题的子问题&#xff0c;递归地求解这些子问题&#xff0c;然后合并这些子问题的解来建立原问题的解&#xff0c;归并排序的步骤如下&#xff1a; 划分&#xff1a;分解待排序的 n 个元素的…

智能诊疗体验:整合AI技术的互联网医院小程序开发

在科技化的趋势下&#xff0c;互联网医院小程序的开发变得愈发重要&#xff0c;尤其是通过整合人工智能&#xff08;AI&#xff09;技术&#xff0c;进一步提升了就医的效率。 一、引言 互联网医院小程序其开发目标是提高医疗服务的效率&#xff0c;同时也也提升了用户的就医…

Linux学习笔记之七(shell脚本的基本语法)

Shell 1、Shell脚本2、常用运算符2、特殊语法4、关于变量的一些命令4.1、echo4.2、export4.3、read4.4、declare/typeset4.5、local4.6、unset 5、基本逻辑语法5.1、if判断5.2、for循环5.3、while循环5.4、case语句 6、函数定义7、多脚本链接 1、Shell脚本 学习shell脚本开发之…

Difference between getc(), getchar(), and gets()

getc(): 从输入中只能读单个字符 getchar()&#xff1a;从标准输入流中输入都单个字符。 两者基本等同&#xff0c;唯一不一样的是getc()是任何输入流&#xff0c;而getchar()是标准输入流。 gets:可以读入含有空格的字符串 // Example for getc() in C #include <stdio.h…

DDD系列 - 第4讲 从架构师的角度看待DDD - 一个关于拆解、微服务、面向对象的故事(二)

目录 第3次拆解 - 面向对象分析与设计3.1 交互入口实现层3.2 面向对象分析3.2.1 根据业务映射类3.2.2 对象持久化仓库3.2.3 自定义属性类3.2.4 类间的关联关系3.2.5 分包提升内聚、包内指定入口类降低耦合3.2.6 定义交互出口3.3 流程编排 & 业务编排3.4 交互出口实现层 &am…

使用AOS实现网页动画效果

在现代Web开发中&#xff0c;动画效果是提升用户体验和页面交互性的重要因素之一。而AOS&#xff08;Animate On Scroll&#xff09;作为一个强大的动画库&#xff0c;可以帮助我们轻松地实现网页元素的滚动动画效果。 什么是AOS&#xff1f; AOS是一个基于CSS3和JavaScript的…

Python学习路线 - Python语言基础入门 - 判断语句

Python学习路线 - Python语言基础入门 - 判断语句 前言布尔类型和比较运算符布尔类型布尔类型的定义 比较运算符 if语句的基本格式if判断语句 if else 语句if elif else 语句判断语句的嵌套实战案例 前言 进行逻辑判断&#xff0c;是生活中常见的行为。同样&#xff0c;在程序…

【uni-app】赋予你的APP(Android原生)小程序开发能力

采用DCloud(数字天堂&#xff08;北京&#xff09;网络技术有限公司)的uniMPsdk(uni小程序SDK)&#xff0c;是为原生App打造的可运行基于 uni-app 开发的小程序前端项目的框架&#xff0c;从而帮助原生App快速获取小程序的能力。 uni-app文档地址(小程序开发人员开发用) uniMP…

冗余链路和生成树协议

文章目录 冗余链路生成树协议 冗余链路 背景&#xff1a;在许多交换机或者交换机设备组成的网络环境中&#xff0c;通常都使用一些备份连接&#xff0c;来提高网络的健全。在金融网中A和B之间不止一条线路&#xff0c;保证网络的安全性能。备份连接也叫做冗余链路 冗余链路带…

Xshell会话文件解密获取密码

Xshell会话文件解密获取密码 开发了一个小工具用于获取已存储的xshell会话密码功能简介截图展示下载地址 开发了一个小工具用于获取已存储的xshell会话密码 在日常开发中&#xff0c;服务器太多&#xff0c;密码记不住。使用xshell管理服务器会话&#xff0c;记住密码&#xf…

详解递归锁,以及递归锁与其他同步机制的区别

什么是递归锁 递归锁是一种多线程同步机制&#xff0c;用于解决线程在多次获取同一个锁时产生死锁的问题。在递归锁中&#xff0c;同一个线程可以多次获取同一个锁&#xff0c;而不会造成死锁。 递归锁具有两个主要操作&#xff1a;上锁&#xff08;lock&#xff09;和解锁&a…

python 自主学习笔记

文章目录 前言相关教程模板字符串JavaScriptC#Python 临时变量C#的ValueTuplePython字典 自定义模块化封装的文件路径问题解决方案 暂时结束 前言 最近在学halcon&#xff0c;机器视觉&#xff0c;越学越发现&#xff0c;python是无法避免的语言。因为python用途实在是太广了。…

深度解析:整数和浮点数在内存中的存储

深度解析&#xff1a;整数和浮点数在内存中的存储 引言 在计算机科学中&#xff0c;理解整数和浮点数在内存中的存储方式是深入学习的关键一步。这篇博客将带你深入探讨整数和浮点数的内存表示&#xff0c;并通过代码实例详细解析其存储结构。 整数的内存存储 对于整形来说&a…

Redis 数据结构详解

分类 编程技术 Redis 数据类型分为&#xff1a;字符串类型、散列类型、列表类型、集合类型、有序集合类型。 Redis 这么火&#xff0c;它运行有多块&#xff1f;一台普通的笔记本电脑&#xff0c;可以在1秒钟内完成十万次的读写操作。 原子操作&#xff1a;最小的操作单位&a…

【开源】基于Vue+SpringBoot的音乐平台

项目编号&#xff1a; S 055 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S055&#xff0c;文末获取源码。} 项目编号&#xff1a;S055&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首…

超大规模集成电路设计----基本概念(二)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----基本概念&#xff08;二&#xff09; 简短的历史回顾(A Brief Historical Perspective)第…