目录
C++11 引入了 以下是 C++11 中正则表达式库的一些关键组件: regex 类:表示一个正则表达式。你可以用它来编译一个正则表达式字符串,并之后用这个编译后的正则表达式进行匹配操作。 regex_match 函数:用于确定一个整个字符串是否与一个正则表达式匹配。 regex_search 函数:用于在一个字符串中搜索与正则表达式匹配的子串。 regex_replace 函数:用于在字符串中替换与正则表达式匹配的子串。 smatch 类:是一个特化的模板类,用于存储 regex_constants 命名空间:包含了一些用于指定正则表达式语法和匹配行为的标志。 下面是一个简单的例子,展示了如何在 C++11 中使用正则表达式: 在这个例子中,我们首先创建了一个 在 函数返回一个布尔值,指示是否找到匹配。 在这个例子中,字符串 在这个例子中,我们使用了带有分组的正则表达式,并通过 在 函数返回一个布尔值,指示是否在字符串中找到匹配的子串。 在这个例子中, 在这个例子中,我们使用了分组正则表达式,并通过 匹配范围: 使用场景: 返回值: 结果处理: 下面是一个简单的代码示例,说明了 在这个例子中,
regex
<regex>
头文件,它提供了对正则表达式的支持。这个库允许你编译、匹配和搜索正则表达式,以及使用正则表达式进行字符串替换。
regex_search
和 regex_match
的结果。它是一个 std::match_results<std::string::const_iterator>
的类型定义。#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"
)。