C++中使用正则需包含头文件,核心类有std::regex、std::smatch等;通过std::regex_match进行完全匹配,std::regex_search查找子串,std::regex_replace实现替换,并可用std::sregex_iterator遍历所有匹配结果,建议复用regex对象以提升性能。

在C++中使用正则表达式主要依赖于标准库中的
包含头文件与基本组件
要使用正则功能,先包含头文件:
#include#include
#include iostream>
C++ 正则库核心类包括:
- std::regex:编译后的正则表达式对象
- std::smatch / std::cmatch:用于保存字符串或字符数组的匹配结果
- std::regex_match:判断整个字符串是否匹配正则
- std::regex_search:在字符串中查找子串匹配
- std::regex_replace:替换匹配内容
完整匹配:regex_match
regex_match 要求整个字符串完全符合正则模式。例如验证邮箱格式(简化版):
立即学习“C++免费学习笔记(深入)”;
std::string email = "test@example.com";std::regex pattern(R"([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})");
if (std::regex_match(email, pattern)) {
std::cout }
R"(...)" 是原始字符串字面量,避免转义反斜杠带来的麻烦。
查找匹配:regex_search
regex_search 用于在文本中查找第一个匹配的子串。适合提取信息:
std::string text = "电话号码是:13812345678";std::regex phone_pattern(R"((1[3-9]\d{9}))");
std::smatch match;
if (std::regex_search(text, match, phone_pattern)) {
std::cout }
match[0] 是完整匹配,match[1] 是第一个捕获组。可用 match.size() 遍历所有组。
提取多个匹配结果
要找出所有匹配项,可结合 std::sregex_iterator:
std::string log = "错误代码:ERR001,ERR002 已记录";std::regex err_pattern(R"(ERR\d{3})");
for (std::sregex_iterator it(log.begin(), log.end(), err_pattern);
it != std::sregex_iterator(); ++it) {
std::cout str() }
替换文本:regex_replace
将匹配内容替换为指定字符串:
std::string input = "用户ID:abc#123,权限不足";std::regex id_pattern(R"([a-zA-Z]+#\d+)");
std::string output = std::regex_replace(input, id_pattern, "****");
std::cout
支持格式化替换,例如用 $1 引用捕获组。
性能建议与注意事项
regex 对象构造较耗时,建议复用而不是频繁创建。可声明为 static 或成员变量:
static const std::regex num_regex(R"(\d+)"); // 避免重复编译注意不同正则语法选项,如 std::regex_constants::icase 表示忽略大小写:
std::regex pattern("error", std::regex_constants::icase);某些复杂正则可能导致栈溢出或性能下降,建议测试边界情况。
基本上就这些。掌握 regex_match、regex_search 和 regex_replace 三大函数,配合 smatch 与迭代器,就能处理大多数文本处理任务。不复杂但容易忽略的是原始字符串和捕获组的使用技巧。











