如here所述:
match[0]:代表整场比赛
match[1]:表示第一个匹配
match[2]:表示第二次匹配,以此类推
这意味着match[0] 应该——在这种情况下! - 在匹配整个内容时保留完整的 source (abcd 16000),而 match[1] 包含 capturing group 的内容。
例如,如果您的正则表达式中有第二个捕获组,您将在匹配集合中获得第三个对象,依此类推。
我是一个更了解可视化问题/解决方案的人,所以让我们这样做:
请参阅demo@regex101。
看到包含测试字符串的文本字段中的两种颜色了吗?
绿色是您的捕获组的背景,而
蓝色代表通常与表达式匹配但未被任何组捕获的所有其他内容。
换句话说:在你的情况下,蓝色+绿色相当于match[0],绿色相当于match[1]。
这样你总能知道match中的哪些对象指的是哪个捕获组:
您在脑海中初始化一个计数器,从 0 开始。现在从左到右遍历正则表达式,为每个 ( 添加 1,为每个 ) 减去 1,直到到达捕获组的左括号想提取。你脑子里的数字就是数组索引。
编辑
关于您对检查res[0].first的评论:
sub_match类的成员first只有
表示比赛开始的位置。
而second表示比赛结束的位置。
(取自boost doc)
两者都返回 char* (VC++10) 或 iterator (Boost),因此您将获得源字符串的子字符串作为输出(如果匹配从索引零开始,这可能是完整的源!)。
考虑以下程序 (VC++10):
#include "stdafx.h"
#include <regex>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
string source = "abcdababcdefg";
string exp = "ab";
tr1::cmatch res;
tr1::regex rx(exp);
tr1::regex_search(source.c_str(), res, rx);
for (size_t n = 0; n < res.size(); ++n)
{
std::cout << "submatch[" << n << "]: matched == " << std::boolalpha
<< res[n].matched <<
" at position " << res.position(n) << std::endl;
std::cout << " " << res.length(n)
<< " chars, value == " << res[n] << std::endl;
}
std::cout << std::endl;
cout << "res[0].first: " << res[0].first << " - res[0].second: " << res[0].second << std::endl;
cout << "res[0]: " << res[0];
cin.get();
return 0;
}
执行它并查看输出。第一个(也是唯一一个)匹配 - 显然 - 第一个匹配字符 ab,所以这实际上是整个匹配字符串以及 res[0] == "ab" 的原因。
现在,知道.first/.second 为我们提供了从匹配开始到匹配结束的子字符串,输出不应该再令人困惑了。