[原创](Modern C++)现代C++的关键性概念: 正则表达式

常用网名: 猪头三

出生日期: 1981.XX.XX

企鹅交流: 643439947

个人网站: 80x86汇编小站

编程生涯: 2001年~至今[共24年]

职业生涯: 22年

开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python

开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder

技能种类: 逆向 驱动 磁盘 文件

研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全

项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]

在C++11之前, C++标准库并未提供官方的正则表达式支持, 通常需要依赖第三方库(如Boost.Regex)或使用C语言的POSIX正则表达式库(regex.h). 然而, 这些方案存在一定的局限性, 例如跨平台支持较差、接口风格与C++标准库不统一等. 自C++11开始, 标准库(头文件)正式引入了正则表达式支持, 使C++能够使用符合ECMAScript标准的正则表达式进行字符串匹配、查找、替换等操作.

[std::regex功能简单说明]
std::regex(正则表达式对象)
std::regex_match(完全匹配)
std::regex_search(查找匹配)
std::regex_replace(替换匹配内容)

迭代器 std::sregex_iterator、std::wsregex_iterator 用于遍历匹配结果

[代码示例]

以下代码展示了如何使用std::wregex 处理包含日期信息的字符串, 并提取其中符合格式的日期.

cpp 复制代码
#include <iostream>
#include <regex>
#include <string>

int main()
{
    // 定义一个包含日期信息的宽字符串
    std::wstring wstr_Info{ LR"("2024-03-05 00:00:00","2024-03-04 00:00:00")"};

    // 定义一个匹配日期格式的正则表达式
    std::wregex regex_Date{ LR"(\d{4}-\d{2}-\d{2})" };

    /*
     *  使用std::regex_search函数查找第一个匹配项, 并打印出来. 
     *  通过不断更新wstr_Info_Temp的起始位置为上一次匹配之后的内容, 实现迭代搜索. 
    */
    std::wstring wstr_Info_Temp{ wstr_Info };
    for (std::wsmatch wsm; std::regex_search(wstr_Info_Temp, wsm, regex_Date);)
    {
        std::wcout << wsm.str() << std::endl;  // 打印匹配的日期字符串
        wstr_Info_Temp = wsm.suffix();          // 更新起始位置为上一次匹配之后的内容
    }

    /*
     *  使用std::wsregex_iterator来遍历所有匹配项, 并打印出来. 
     *  这种方法更简洁, 但需要将整个输入序列传递给迭代器构造函数. 
    */
    for (std::wsregex_iterator Search(wstr_Info.begin(), wstr_Info.end(), regex_Date);
         Search != std::wsregex_iterator{};
        ++Search)
    {
        std::wcout << Search->str() << std::endl;  // 打印匹配的日期字符串
    }

    return 0;
}

[总结]

在本篇文章中, 介绍了C++标准库中正则表达式的基本概念, 并讲解了如何在现代C++(C++11及以上)中使用std::regex进行字符串匹配. 通过std::regex_search和std::wsregex_iterator可以提取匹配的文本. 正则表达式是一个强大的文本处理工具, 在C++应用开发中, 它可以用于数据解析、日志分析、输入验证等多种场景. 希望本篇文章能帮助读者更好地理解和使用C++的正则表达式功能.

相关推荐
朝朝又沐沐4 小时前
算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现
开发语言·数据结构·c++·算法·链表
逝雪Yuki5 小时前
Leetcode——287. 寻找重复数
c++·leetcode·二分查找·双指针·环形链表
李永奉6 小时前
C语言-流程控制语句:for循环语句、while和do…while循环语句;
c语言·开发语言·c++·算法
打码农的篮球7 小时前
STL——list
开发语言·c++·list
C++ 老炮儿的技术栈7 小时前
在 Scintilla 中为 Squirrel 语言设置语法解析器的方法
linux·运维·c++·git·ubuntu·github·visual studio
@蓝莓果粒茶8 小时前
LeetCode第350题_两个数组的交集II
c++·python·学习·算法·leetcode·职场和发展·c#
Jackilina_Stone10 小时前
【faiss】用于高效相似性搜索和聚类的C++库 | 源码详解与编译安装
android·linux·c++·编译·faiss
喜欢吃燃面10 小时前
C++:list(1)list的使用
开发语言·c++·学习
神仙别闹11 小时前
基于QT(C++)实现(图形界面)选课管理系统
java·c++·qt
NicolasCage12 小时前
C语言指针Pointers
c++·后端