如何仅获取给定的捕获组 <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)

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

【讨论】:

以上是关于如何仅获取给定的捕获组 <regex> c++的主要内容,如果未能解决你的问题,请参考以下文章

如何获取正则表达式捕获组的值? [复制]

Python regex - 匹配仅包含 A、B 或 C 的单词

Java Regex替换为捕获组

RegEx 用于捕获字符串中的数字

有没有办法让 Regex.Match 只提供预期的捕获组?

在 replaceAll 中以编程方式获取捕获组