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 解析等)。
3572

被折叠的 条评论
为什么被折叠?



