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

相关推荐
余额瞒着我当琳6 小时前
红黑树的实现--红黑树的概念、规则、效率、结构、旋转、查找、验证
数据结构·c++·算法
青少儿编程课堂7 小时前
AC自动机多模式串匹配精讲:校园关键词巡检实战解析
c++·python·算法·bfs·信息学竞赛
longlongzihan7 小时前
LeetCode 5. 最长回文子串:从暴力匹配到中心扩展的思维演进
c++·算法·leetcode
多弗朗皮卡丘7 小时前
C++继承
c++·继承
汉克老师8 小时前
GESP2026年9月认证C++七级( 第三部分编程题(2、括号序列))精讲
c++·gesp·小学生·学c++编程
jimy110 小时前
虚函数vtable,链接时看到构造函数,linker把符号地址写入vtable(三)
开发语言·c++
潼心1412o11 小时前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i11 小时前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
wuminyu11 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
All for pursuit.12 小时前
【回溯-6】79.单词搜索
数据结构·c++·算法·leetcode