C++ 的正则表达式功能通过标准库 <regex>
提供,自 C++11 起被纳入标准。它允许你进行模式匹配、搜索、替换等操作,核心围绕几个关键类和函数展开。下面从基础开始讲解:
一、核心组件
使用前需包含头文件并使用标准命名空间:
cppRun
#include <regex>
#include <string>
#include <iostream>
using namespace std; // 简化代码,实际项目可按需使用
主要类和函数:
-
std::regex
:存储正则表达式模式的对象(编译后的模式)。 -
std::smatch
:存储匹配结果的容器(用于字符串匹配),包含整个匹配文本和捕获组。 -
std::regex_match
:完全匹配(整个字符串必须符合模式)。 -
std::regex_search
:部分匹配(字符串中存在符合模式的子串即可)。 -
std::regex_replace
:替换匹配到的子串。
二、基础用法示例
1. 完全匹配(regex_match)
检查整个字符串是否符合模式(比如验证手机号、邮箱等)。
示例:验证是否为纯数字字符串
cppRun
int main() {
string s = "123456";
regex pattern("\\d+"); // \d+ 表示1个或多个数字(C++中\需转义为\\)
bool is_match = regex_match(s, pattern);
cout << (is_match ? "匹配" : "不匹配") << endl; // 输出:匹配
return 0;
}
2. 部分匹配与捕获组(regex_search + smatch)
搜索字符串中符合模式的子串,并提取匹配的内容(包括捕获组)。
示例:从文本中提取邮箱地址(简单模式)
cppRun
int main() {
string text = "我的邮箱是abc123@example.com,你的是xyz@test.cn";
regex email_pattern("(\\w+)@(\\w+\\.\\w+)"); // 捕获组1:用户名,组2:域名
smatch result; // 存储匹配结果
if (regex_search(text, result, email_pattern)) {
cout << "找到邮箱:" << result.str() << endl; // 整个匹配:abc123@example.com
cout << "用户名:" << result[1].str() << endl; // 捕获组1:abc123
cout << "域名:" << result[2].str() << endl; // 捕获组2:example.com
}
return 0;
}
3. 替换匹配内容(regex_replace)
将匹配到的子串替换为指定内容。
示例:替换所有数字为*
cppRun
int main() {
string text = "密码是123456,验证码是789";
regex num_pattern("\\d"); // 匹配单个数字
string replaced = regex_replace(text, num_pattern, "*");
cout << replaced << endl; // 输出:密码是******,验证码是***
return 0;
}
三、常用元字符与模式
正则表达式的模式由元字符构成,常用的有:
-
.
:匹配任意单个字符(除换行)。 -
*
:匹配前一个元素 0 次或多次(如a*
匹配""
、"a"
、"aa"
等)。 -
+
:匹配前一个元素 1 次或多次(如a+
至少 1 个a
)。 -
?
:匹配前一个元素 0 次或 1 次(如a?
可选 1 个a
)。 -
^
:匹配字符串开头(如^abc
匹配以abc
开头的字符串)。 -
:匹配字符串结尾(如
xyz$
匹配以xyz
结尾的字符串)。 -
[]
:字符集,匹配其中任意一个字符(如[0-9a-zA-Z]
匹配数字或字母)。 -
()
:捕获组,用于提取子匹配(如(abc)
可通过result[1]
获取)。 -
\\d
:匹配数字(等价于[0-9]
)。 -
\\w
:匹配字母、数字、下划线(等价于[a-zA-Z0-9_]
)。
四、注意事项
-
转义字符:C++ 字符串中
\
需要转义为\\
,因此正则中的\d
在 C++ 中需写为\\d
。 -
C++ 版本:
<regex>
是 C++11 引入的,编译时需开启 C11 及以上标准(如g++ -std=c++11 main.cpp
)。 -
性能:复杂的正则表达式可能影响性能,建议根据场景优化模式。
-
匹配模式:
regex
构造时可指定模式(如忽略大小写regex::icase
):cppRunregex pattern("hello", regex::icase); // 忽略大小写匹配"hello"
通过以上内容,你可以开始使用 C++ 正则表达式处理文本匹配、提取和替换等任务。实际使用中,可结合具体场景调整正则模式(如更复杂的邮箱验证、URL 解析等)。