如何仅获取给定的捕获组 <regex> c++
Posted
技术标签:
【中文标题】如何仅获取给定的捕获组 <regex> c++【英文标题】:How to get only given captured group <regex> c++ 【发布时间】:2017-08-16 10:30:27 【问题描述】:我想提取标签的内部内容。来自以下字符串:
<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 个包含两个子匹配的匹配:1) 整个匹配,2) 捕获组 1 值。可以使用matches[1].str()
或matches.str(1)
访问捕获
【参考方案1】:
regex_match
只返回一个匹配项,包括所有捕获组子匹配项(它们的数量取决于模式中有多少组)。
在这里,您只会得到 1 个包含两个子匹配的匹配:1) 整个匹配,2) 捕获组 1 值。
要获取捕获组的内容,需要访问smatches
对象第二个元素matches[1].str()
或matches.str(1)
请注意,当您编写 "<tag1.*>(.*)</tag1>\1"
时,\1
不会被解析为反向引用,而是被解析为八进制代码 1 的字符。即使您定义了 反向引用 em>(如"<tag1.*>(.*)</tag1>\\1"
)您需要在</tag1>
之后重复使用捕获组1 捕获的整个文本 - 这绝对不是您想要的。实际上,我怀疑这个正则表达式有什么好处,至少,你需要用"[\\s\\S]*?"
替换".*"
,但是用正则表达式解析 html 仍然是一种脆弱的方法。
【讨论】:
以上是关于如何仅获取给定的捕获组 <regex> c++的主要内容,如果未能解决你的问题,请参考以下文章