如何仅获取捕获的组<regex> c ++

时间:2017-03-23 17:45:30

标签: c++ regex c++11

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

<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"

我得到零比赛。

请建议。

1 个答案:

答案 0 :(得分:2)

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

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

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

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