C++ 如何仅获取给定的捕获组<;regex>;c++;

C++ 如何仅获取给定的捕获组<;regex>;c++;,c++,regex,c++11,C++,Regex,C++11,我想提取标签的内部内容。从以下字符串: <tag1 val=123>Hello</tag1> 我所做的: string s = "<tag1 val=123>Hello</tag1>"; regex re("<tag1.*>(.*)</tag1>"); smatch matches; bool b = regex_match(s, matches, re); string s=“你好”; regex re(“(*)”);

我想提取标签的内部内容。从以下字符串:

<tag1 val=123>Hello</tag1>
我所做的:

string s = "<tag1 val=123>Hello</tag1>";
regex re("<tag1.*>(.*)</tag1>");
smatch matches;
bool b = regex_match(s, matches, re);
string s=“你好”;
regex re(“(*)”);
小比赛;
bool b=正则表达式匹配(s,匹配,re);
但它返回两个匹配项:

<tag1 val=123>Hello</tag1>
Hello
你好 你好 当我试图只抓到第一个这样的团队时:

"<tag1.*>(.*)</tag1>\1"
(.*)\1 我没有找到匹配项

请告知。

只返回一个匹配,所有捕获组子匹配(它们的数量取决于模式中有多少组)

在这里,您只得到一个包含两个子匹配的匹配:1)完整匹配,2)捕获组1值

要获取捕获组的内容,您需要访问
smatches
object第二个元素,
matches[1].str()
matches.str(1)


请注意,当您编写
“(.*)\1”
时,
\1
不会被解析为反向引用,而是作为八进制代码为1的字符。即使您定义了反向引用(如
“(.*)\\1”
),您也需要在
之后重复使用捕获组1捕获的整个文本-这绝对不是您想要的。事实上,我怀疑这个正则表达式是否有用,至少,您需要将
“*”
替换为
“[\\s]*?”
,但使用正则表达式解析HTML仍然是一种脆弱的方法。

您只得到一个包含两个子匹配的匹配:1)完整匹配,2)捕获组1值。可以使用
matches[1].str()或
matches.str(1)
"<tag1.*>(.*)</tag1>\1"