我想提取标签的内容。从以下字符串:
<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"
我得到零比赛。
请建议。
答案 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仍然是一种脆弱的方法。