C++11中的正则表达式
regex
C++11 引入了 <regex>
头文件,它提供了对正则表达式的支持。这个库允许你编译、匹配和搜索正则表达式,以及使用正则表达式进行字符串替换。
以下是 C++11 中正则表达式库的一些关键组件:
-
regex 类:表示一个正则表达式。你可以用它来编译一个正则表达式字符串,并之后用这个编译后的正则表达式进行匹配操作。
-
regex_match 函数:用于确定一个整个字符串是否与一个正则表达式匹配。
-
regex_search 函数:用于在一个字符串中搜索与正则表达式匹配的子串。
-
regex_replace 函数:用于在字符串中替换与正则表达式匹配的子串。
-
smatch 类:是一个特化的模板类,用于存储
regex_search
和regex_match
的结果。它是一个std::match_results<std::string::const_iterator>
的类型定义。 -
regex_constants 命名空间:包含了一些用于指定正则表达式语法和匹配行为的标志。
下面是一个简单的例子,展示了如何在 C++11 中使用正则表达式:
#include <iostream>
#include <string>
#include <regex>
int main() {
std::string s("Example string for regex matching.");
std::regex e("regex"); // 正则表达式字面量
// 使用 regex_search 查找匹配的子串
if (std::regex_search(s, e)) {
std::cout << "String contains 'regex'.\n";
} else {
std::cout << "String does not contain 'regex'.\n";
}
// 使用 regex_replace 替换匹配的子串
std::string replaced = std::regex_replace(s, e, "pattern");
std::cout << "Replaced string: " << replaced << std::endl;
// 使用 smatch 存储匹配结果
std::smatch match;
if (std::regex_search(s, match, e)) {
std::cout << "Match found: " << match.str() << std::endl;
}
return 0;
}
在这个例子中,我们首先创建了一个 std::regex
对象来表示正则表达式。然后,我们使用 std::regex_search
来检查字符串中是否包含与正则表达式匹配的子串。接着,我们使用 std::regex_replace
来替换匹配的子串。最后,我们使用 std::smatch
对象来存储 std::regex_search
的匹配结果,并打印出匹配的子串。
regex_match函数详解
regex_match
是 C++ 标准库 <regex>
中的一个函数,用于确定一个给定的整个字符串是否与一个正则表达式匹配。下面详细解释 regex_match
函数的工作原理和使用方法。
函数原型
在 <regex>
头文件中,regex_match
有几个重载版本,但最常用的是以下两个:
bool regex_match(const std::string& s, const std::regex& e);
bool regex_match(const std::string& s, std::smatch& m, const std::regex& e);
- 第一个参数
s
是要进行匹配的输入字符串。 - 第二个参数可以是
std::regex
对象e
,代表正则表达式,或者是std::smatch
对象m
(或与std::smatch
类似的类型),用于存储匹配的结果信息。当使用std::smatch
时,它会包含整个匹配的信息以及任何分组(括号中的子匹配)。 - 第三个参数总是
std::regex
对象e
,表示正则表达式。
函数返回一个布尔值,指示是否找到匹配。
使用方法
基本使用
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string s("12345");
std::regex e("\\d+"); // 正则表达式,匹配一个或多个数字
// 检查整个字符串是否与正则表达式匹配
if (std::regex_match(s, e)) {
std::cout << "The string matches the regular expression.\n";
} else {
std::cout << "The string does not match the regular expression.\n";
}
return 0;
}
在这个例子中,字符串 s
包含的是 "12345"
,它是一个由数字组成的字符串。正则表达式 e
是 "\\d+"
,它匹配一个或多个数字。因此,regex_match
返回 true
,表示整个字符串与正则表达式匹配。
使用 std::smatch 获取更多信息
std::smatch
是一个特殊的容器,用于保存 regex_match
或 regex_search
的结果。它可以让你访问匹配的子字符串以及它们在原字符串中的位置。
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string s("The quick brown fox");
std::regex e("(.*) (brown) (.*)"); // 分组正则表达式
std::smatch match;
if (std::regex_match(s, match, e)) {
std::cout << "Matched!\n";
// 输出匹配的分组
for (const auto& m : match) {
std::cout << m << " ";
}
std::cout << "\n";
} else {
std::cout << "Not matched!\n";
}
return 0;
}
在这个例子中,我们使用了带有分组的正则表达式,并通过 std::smatch
接收匹配的结果。如果匹配成功,match
将包含整个匹配的字符串以及分组匹配的子字符串,我们可以遍历 match
来访问这些信息。
注意事项
regex_match
函数只会在整个输入字符串与正则表达式完全匹配时返回true
。如果你想要在字符串中搜索正则表达式的一部分,应该使用regex_search
。- 使用复杂的正则表达式时,注意转义字符的使用。例如,在正则表达式字符串中,要匹配一个字面量反斜杠
\
,你需要写作"\\\\"
。 - 正则表达式的编写和理解可能需要一些时间,特别是当涉及到更高级的功能如捕获组、零宽断言等时。有多种在线工具可以帮助你测试和调试正则表达式。
regex_search函数详解
regex_search
是 C++ 标准库 <regex>
中的一个非常有用的函数,用于在字符串中搜索与正则表达式匹配的子串。与 regex_match
不同,regex_search
不需要整个字符串与正则表达式完全匹配,只要找到任何匹配的子串,它就会返回成功。
函数原型
在 <regex>
头文件中,regex_search
的一些常见重载版本如下:
bool regex_search(const std::string& s, const std::regex& e);
bool regex_search(const std::string& s, std::smatch& m, const std::regex& e);
- 第一个参数
s
是要进行搜索的输入字符串。 - 第二个参数可以是
std::regex
对象e
,代表正则表达式,或者是std::smatch
对象m
(或与std::smatch
类似的类型),用于存储匹配结果的信息。当使用std::smatch
时,它会包含匹配的子串以及任何分组(括号中的子匹配)。 - 第三个参数总是
std::regex
对象e
,表示要搜索的正则表达式。
函数返回一个布尔值,指示是否在字符串中找到匹配的子串。
使用方法
基本使用
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string s("The price is 123 dollars.");
std::regex e("\\d+"); // 正则表达式,匹配一个或多个数字
// 在字符串中搜索与正则表达式匹配的子串
if (std::regex_search(s, e)) {
std::cout << "Found a match!\n";
} else {
std::cout << "No match found.\n";
}
return 0;
}
在这个例子中,regex_search
会在字符串 s
中搜索与正则表达式 e
匹配的子串。正则表达式 e
是 "\\d+"
,它匹配一个或多个数字。因为字符串 s
包含 "123"
,所以 regex_search
返回 true
。
使用 std::smatch 获取匹配信息
std::smatch
对象可以保存 regex_search
的匹配结果,并提供对匹配的子串及其位置的访问。
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string s("Example: 123abc, 456def, 789ghi.");
std::regex e("(\\d+)(\\w+)"); // 正则表达式,匹配数字和字母序列
std::smatch match;
if (std::regex_search(s, match, e)) {
std::cout << "Found a match!\n";
// 输出匹配的子串和分组
for (size_t i = 0; i < match.size(); ++i) {
std::cout << "Match " << i << ": " << match[i] << '\n';
}
} else {
std::cout << "No match found.\n";
}
return 0;
}
在这个例子中,我们使用了分组正则表达式,并通过 std::smatch
接收匹配的结果。如果找到匹配项,match
将包含整个匹配的子串以及由括号定义的分组。我们可以通过索引访问 match
中的元素来获取这些信息。
注意事项
regex_search
函数只要找到第一个匹配的子串就会停止搜索,并返回成功。如果你想找到字符串中所有的匹配项,你需要使用循环,并在每次找到匹配项后更新搜索的起始位置。- 与
regex_match
类似,编写复杂的正则表达式时需要注意转义字符的使用。 - 如果你的正则表达式包含多个分组,
std::smatch
将会包含相应数量的分组匹配结果,以及整个匹配的子串。std::smatch[0]
总是包含整个匹配的子串。
regex_search和regex_match的区别
regex_search
和 regex_match
是 C++11 <regex>
库中提供的两个用于正则表达式匹配的函数,它们之间有着关键的区别:
-
匹配范围:
regex_match
:这个函数试图将整个输入字符串与正则表达式进行匹配。只有当整个字符串完全符合正则表达式所定义的模式时,匹配才会成功。regex_search
:这个函数在输入字符串中搜索与正则表达式匹配的任何子串。它不需要整个字符串与正则表达式匹配,只要字符串中存在一个与正则表达式匹配的子串,搜索就会成功。
-
使用场景:
- 当你想要确认一个字符串是否完全由一个特定的模式组成时,你会使用
regex_match
。例如,验证一个字符串是否为有效的电子邮件地址或电话号码。 - 当你想要在一个较大的文本块中查找符合特定模式的子串时,你会使用
regex_search
。例如,在文章中查找所有的日期或电话号码实例。
- 当你想要确认一个字符串是否完全由一个特定的模式组成时,你会使用
-
返回值:
- 两个函数都返回一个布尔值,指示是否找到了匹配项。对于
regex_match
,如果整个字符串匹配,则返回true
;对于regex_search
,如果在字符串中找到匹配的子串,则返回true
。
- 两个函数都返回一个布尔值,指示是否找到了匹配项。对于
-
结果处理:
- 当与
smatch
(或类似的匹配结果类)一起使用时,regex_search
可以提供关于匹配子串的更多信息,如其在字符串中的位置和长度。regex_match
也可以与这些类一起使用,但由于它匹配整个字符串,所以匹配结果通常不那么复杂。
- 当与
下面是一个简单的代码示例,说明了 regex_search
和 regex_match
之间的区别:
#include <iostream>
#include <string>
#include <regex>
int main() {
std::string s("123abc456");
std::regex e("\\d+"); // 匹配一个或多个数字
// 使用 regex_match 尝试匹配整个字符串
if (std::regex_match(s, e)) {
std::cout << "The entire string is a match.\n";
} else {
std::cout << "The entire string is not a match.\n"; // 这将被执行
}
// 使用 regex_search 查找匹配的子串
if (std::regex_search(s, e)) {
std::cout << "A substring is a match.\n"; // 这将被执行
} else {
std::cout << "No substring is a match.\n";
}
return 0;
}
在这个例子中,regex_match
失败,因为整个字符串 s
不完全由数字组成。然而,regex_search
成功,因为字符串 s
中包含与正则表达式 e
匹配的子串(即 "123"
和 "456"
)。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~