std::smatch 使用例子
时间: 2023-05-21 10:01:28 浏览: 117
std::string s ("this subject has a submarine as a subsequence");
std::regex e ("\\b(sub)([^ ]*)"); // matches words beginning by "sub"
std::smatch m;
std::cout << "Target sequence: " << s << std::endl;
std::cout << "Regular expression: /\\b(sub)([^ ]*)/" << std::endl;
std::cout << "The following matches and submatches were found:" << std::endl;
while (std::regex_search (s,m,e)) {
for (auto x:m) std::cout << x << " ";
std::cout << std::endl;
s = m.suffix().str();
}
相关问题
std::smatch
`std::smatch` 是 C++ 标准库 `<regex>` 头文件中的一部分,它是一个模板类,用于存储由正则表达式模式匹配得到的结果。当你使用 `std::regex_match()` 或 `std::regex_search()` 等函数对输入字符串进行匹配时,`smatch` 对象会被用来保存找到的匹配项及其范围。
`smatch` 类型的实例包含一个容器适配器,内部包含一个大小固定的数组,每个元素对应正则表达式中的一个捕获组。这些捕获组通常是通过在正则表达式中使用圆括号 `( )` 来定义的。你可以通过 `smatch` 的成员函数如 `.begin()`、`.end()` 访问匹配结果,以及 `.str()` 获取匹配的子串,`.first` 和 `.second` 属性获取开始和结束的位置等。
举个例子:
```cpp
std::string str = "Hello (World), nice to meet you!";
std::regex pattern("(\\w+) \\((\\w+)\\)");
std::smatch match;
if (std::regex_search(str, match, pattern)) {
std::cout << "Matched: " << match[0] << ", World = " << match[1] << ", nice = " << match[2] << '\n';
}
```
在这个例子中,`match` 匹配到了整个字符串、第一个括号内的单词("World")和第二个括号内的单词("nice")。
std::regex如何使用命名捕获组
使用命名捕获组可以使正则表达式更易读、易维护。在 C++11 及以上版本中,可以使用 std::regex 进行正则表达式的匹配,并支持命名捕获组。下面是一个示例:
```cpp
#include <iostream>
#include <regex>
#include <string>
int main() {
std::string s = "Hello, world!";
std::regex re(R"(^(?P<greeting>\w+),\s*(?P<subject>\w+)!)");
std::smatch match;
if (std::regex_search(s, match, re)) {
std::cout << "Greeting: " << match.str("greeting") << '\n';
std::cout << "Subject: " << match.str("subject") << '\n';
}
return 0;
}
```
在上面的例子中,我们使用了命名捕获组来匹配一个字符串。正则表达式 `^(?P<greeting>\w+),\s*(?P<subject>\w+)!` 匹配一个以字母或数字开头的字符串作为问候语,接着是一个逗号和可选的空格,最后是一个以字母或数字结尾的字符串作为主题。其中,`(?P<greeting>\w+)` 和 `(?P<subject>\w+)` 就是命名捕获组,分别对应问候语和主题。
在 `std::regex_search` 函数中,如果正则表达式匹配成功,`match` 对象就会保存匹配结果。我们可以使用 `match.str("greeting")` 和 `match.str("subject")` 分别获取命名捕获组的值。
需要注意的是,命名捕获组的语法是 `(?P<name>pattern)`,其中 `name` 是捕获组的名称,`pattern` 是正则表达式的模式。在使用命名捕获组时,可以使用 `match[名字]` 或 `match.str(名字)` 来访问捕获组的值。
阅读全文