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"