[原创](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++的正则表达式功能.

相关推荐
熊猫_豆豆3 小时前
QT6 Android C++ 自制美观闹钟
android·c++·qt·闹钟
随意起个昵称3 小时前
状压dp-基础题目2([USACO12MAR] Cows in a Skyscraper G)
c++·算法·动态规划
无限的鲜花5 小时前
协程本质是函数加状态机——零基础深入浅出 C++20 协程
c++·算法·c++20
精明的身影5 小时前
C++自学之路1:Hello world
开发语言·c++
旖-旎5 小时前
《LeetCode 64 最小路径和 || LeetCode 174 地下城游戏》
c++·算法·leetcode·动态规划
森林古猿15 小时前
再论斜率优化
c++·学习·算法
水利行业RTU手艺人5 小时前
RTU固件中的“数据保险箱”——离线数据补发系统设计
c++·stm32·单片机·物联网
凯瑟琳.奥古斯特6 小时前
力扣1009补码解法C++实现
开发语言·c++·算法·leetcode·职场和发展
zh_xuan9 小时前
c++ optional用法
开发语言·c++·optional
Let's Chat Coding10 小时前
身份识别、身份认证与授权的区别
c++