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

相关推荐
小小龙学IT2 分钟前
C++ 正则表达式完全指南:从 std::regex 实战到 RE2 引擎原理(NFA/DFA/回溯陷阱)
c++·正则表达式
circuitsosk3 小时前
AI输出的“质检员”:构建智能体质量评估、异常检测与人工兜底的三层防线
人工智能·python·microsoft·正则表达式·langchain
码匠许师傅3 小时前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
C++ 老炮儿的技术栈3 小时前
Qt5.9.1 Windows 完整开发环境搭建流程
开发语言·c++·windows·qt·编辑器·代码化
欧特克_Glodon4 小时前
OpenCV计算机视觉开发入门与实践<十一>:矩阵的复制和矩形类Rect
c++·opencv·计算机视觉·矩阵
键盘会跳舞4 小时前
C++:std::tuple 源码级深度拆解——变参模板、SFINAE与模板元编程核心技巧
开发语言·c++·sfinae·变参模板
bkspiderx4 小时前
从零开始:VS Code搭建C/C++开发环境全指南(Windows/macOS/Linux)
c语言·c++·windows·vs code·c/c++开发环境
东华万里4 小时前
第40篇C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·面试·大学生专区
luj_17685 小时前
元设计的诱惑与现实
c语言·开发语言·c++·经验分享·算法
小星星闪亮登场5 小时前
ST表--倍增思想
开发语言·数据结构·c++·算法·思维