当前位置: 首页 > article >正文

【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_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.kler.cn/a/156806.html

相关文章:

  • 矩阵的各种计算:乘法、逆矩阵、转置、行列式等——基于Excel实现
  • 【贪心算法】No.1---贪心算法(1)
  • Qt初识简单使用Qt
  • Android Profiler 内存分析
  • 解决MySQL中整型字段条件判断禁用不生效的问题
  • nvm 安装指定node版本时--list 显示为空
  • STM32单片机项目实例:基于TouchGFX的智能手表设计(1)项目介绍及GUI界面基础
  • 应用于智慧工厂的AI边缘计算盒子+AI算法软硬一体化方案
  • Oracle(2-8)Configuring the Database Archiving Mode
  • Typora免费版安装教程(仅供学习)
  • 【vue】尚硅谷vue3学习笔记
  • Vue2学习笔记(事件处理)
  • 谈谈 .NET8 平台中对 LiteDB 的 CRUD 操作
  • 羊大师教你如何有效应对冬季流感,保护自己与家人
  • CRM实战:如何对商机阶段进行有效管理
  • 智能联动第三方告警中心,完美实现故障响应全闭环
  • 如何使用cpolar+Plex在Windows系统上搭建私人媒体影音站点公网可访问
  • 1+x网络系统建设与运维(中级)-练习3
  • 【蓝桥杯】翻硬币
  • 地方公派|商学院老师对口加拿大古德曼商学院访学交流
  • 微信小程序引入node_modules依赖
  • Android启动系列之进程杀手--lmkd
  • 数字法院大脑管理|助力实现司法数字化
  • jupyter notebook 添加环境与删除环境
  • 【数据结构】手撕排序NO.1
  • Android 获取屏幕方向,根据屏幕旋转角度判断屏幕实际方向