如何在C++中获取给定的捕获组<regex>?

4
我希望您能提取标签的内部内容。从以下字符串:
<tag1 val=123>Hello</tag1>

我只想获取。
Hello

我的工作内容:

string s = "<tag1 val=123>Hello</tag1>";
regex re("<tag1.*>(.*)</tag1>");
smatch matches;
bool b = regex_match(s, matches, re);

但它返回了两个匹配项:

<tag1 val=123>Hello</tag1>
Hello

当我尝试像这样获取仅第一个捕获组时:

"<tag1.*>(.*)</tag1>\1"

我没有得到任何匹配结果。 请给予建议。

2
你只会得到一个包含两个子匹配项的匹配结果:1)完整匹配,2)捕获组1的值。可以使用matches[1].str()matches.str(1)来访问捕获组。 - Wiktor Stribiżew
1个回答

5
regex_match 函数只返回一个匹配项,并且包含所有捕获组的子匹配项(子匹配项的数量取决于模式中有多少个组)。
在这里,您只获得一个包含两个子匹配项的匹配项:1)完整匹配,2)捕获组 1 的值。
要获取捕获组的内容,您需要访问 smatches 对象的第二个元素,即 matches[1].str()matches.str(1)
请注意,当您编写 "<tag1.*>(.*)</tag1>\1" 时,\1 不是解析为 反向引用,而是被解析为八进制代码为 1 的字符。即使您定义了一个 反向引用(如 "<tag1.*>(.*)</tag1>\\1"),您也需要在 </tag1> 之后重复捕获组 1 捕获的整个文本,这绝不是您想要的结果。实际上,我怀疑这个正则表达式是否好用,至少,您需要将 ".*" 替换为 "[\\s\\S]*?",但这仍然是一种脆弱的方法来解析 HTML。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接