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

c++11总结26——std::regex

std::regex 是 C++11 引入的 正则表达式库,用于 字符串匹配、搜索和替换

🔹 头文件#include <regex>
🔹 命名空间std
🔹 支持的匹配模式:ECMAScript(默认)、POSIX 规则等。

主要组件

组件作用示例
std::regex正则表达式对象std::regex pattern("\\d+");
std::regex_match完全匹配字符串std::regex_match("123", pattern);
std::regex_search搜索子串匹配std::regex_search("abc123", pattern);
std::regex_replace替换匹配部分std::regex_replace("abc123", pattern, "***");
std::smatch存储匹配结果(字符串版)std::smatch match;
std::cmatch存储匹配结果(C 字符串版)std::cmatch match;

基本用法

(1)检查字符串是否完全匹配

#include <iostream>
#include <regex>int main() {std::string str = "123";std::regex pattern("\\d+");  // 匹配数字if (std::regex_match(str, pattern)) {std::cout << "完全匹配!" << std::endl;} else {std::cout << "匹配失败!" << std::endl;}
}

(2)搜索字符串中是否包含匹配项

#include <iostream>
#include <regex>int main() {std::string str = "abc123xyz";std::regex pattern("\\d+");  // 查找数字std::smatch match;// std::regex_search() 适用于 查找子字符串是否匹配 的情况if (std::regex_search(str, match, pattern)) {std::cout << "找到匹配: " << match[0] << std::endl;}
}

(3)字符串替换

#include <iostream>
#include <regex>int main() {std::string str = "hello 123 world";std::regex pattern("\\d+");  // 目标:匹配数字// std::regex_replace() 适用于 将匹配项替换为新内容std::string replaced = std::regex_replace(str, pattern, "***");std::cout << "替换后:" << replaced << std::endl;
}

(4)提取多个匹配项

#include <iostream>
#include <regex>int main() {std::string str = "email: test@example.com, contact: user@mail.com";std::regex pattern(R"([\w.%+-]+@[\w.-]+\.[a-zA-Z]{2,})");  // 匹配邮箱std::smatch match;while (std::regex_search(str, match, pattern)) {std::cout << "找到邮箱: " << match[0] << std::endl;str = match.suffix();  // 继续查找}
}

语法

(1)常见正则语法

表达式作用示例匹配
\d数字"123"
\w字母、数字、下划线"abc_123"
.任意字符(除换行)"a" "!"
\s空格" "
^字符串开头^abc 匹配 "abc123" 但不匹配 "1abc"
$字符串结尾abc$ 匹配 "123abc"
+至少一个\d+ 匹配 "123" "4567"
*0 个或多个a* 匹配 "" "a" "aaaa"
?0 或 1 个colou?r 匹配 "color""colour"
{n,m}重复 n 到 m 次\d{2,4} 匹配 "12" "1234"
()分组(\d+)-(\d+)
``

(2)特殊匹配

语法作用
(?:...)非捕获组
(?=...)正向预查
(?!...)负向预查

存在的问题

1. std::regex 在 GCC 4.8.5 及以下版本崩溃

GCC 4.8.5 的 std::regex 不稳定,容易崩溃

解决方案

  • 升级 GCC 4.9+

  • 使用 boost::regex 代替

  • 使用 pcre 代替

2. std::regex 解析长字符串性能差

解决方案

  • 使用 std::sregex_iterator 遍历字符串
  • 改用 boost::regexpcre,它们更快。

3. std::regex_replace()处理大文本效率低

解决方案

  • 使用 std::ostringstream 手动拼接字符串,减少替换操作。

方案对比

方法适用场景速度兼容性
std::regexC++11 及以上,简单匹配较慢仅 C++11+
boost::regexC++98 兼容,功能强大中等兼容 C++98
PCRE高效匹配大文本最快需要安装
手写字符串查找仅匹配简单内容最快兼容所有 C++

总结

功能使用方法
完全匹配std::regex_match(str, pattern);
搜索字符串std::regex_search(str, match, pattern);
替换字符串std::regex_replace(str, pattern, "new");
遍历所有匹配std::sregex_iterator

推荐

  • 简单匹配:直接用 std::regex
  • 老版本 C++(C++98/C++03):使用 boost::regex
  • 高性能需求:使用 PCRE
http://www.lryc.cn/news/532352.html

相关文章:

  • langchain教程-12.Agent/工具定义/Agent调用工具/Agentic RAG
  • leetcode_双指针 125.验证回文串
  • ML.NET库学习001:基于PCA的信用卡异常检查之样本处理与训练
  • 【华为OD机考】华为OD笔试真题解析(1)--AI处理器组合
  • edu小程序挖掘严重支付逻辑漏洞
  • 力扣 279. 完全平方数
  • 鸿蒙生态潮起:开发者的逐浪之旅
  • Diskgenius系统迁移之后无法使用USB启动
  • Kafka 可靠性探究—副本刨析
  • 我的博文天地测试报告
  • EtherCAT主站IGH-- 35 -- IGH之pdo_list.h/c文件解析
  • 嵌入式开发神器:Buildroot的介绍和使用方法
  • JavaScript系列(61)--边缘计算应用开发详解
  • 【LeetCode】day15 142.环形链表II
  • 代理对象与目标对象
  • 【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信
  • DNN(深度神经网络)近似 Lyapunov 函数
  • 128陷阱
  • PromptSource和LangChain哪个更好
  • 构成正方形的数量:算法深度剖析与实践
  • Redis持久化-秒杀系统设计
  • 音视频入门基础:RTP专题(8)——使用Wireshark分析RTP
  • OpenAI 实战进阶教程 - 第六节: OpenAI 与爬虫集成实现任务自动化
  • SpringUI Web高端动态交互元件库
  • 解密企业安全密码:密钥管理服务如何重塑数据保护?
  • 基于keepalived+GTID半同步主从复制的高可用MySQL集群
  • 图片PDF区域信息批量提取至Excel,基于QT和阿里云api的实现方案
  • Java 大视界 -- Java 大数据在智能教育中的应用与个性化学习(75)
  • 从零手写Spring IoC容器(二):bean的定义与注册
  • 《大模型面试宝典》(2025版) 发布了