【问题标题】:Regex backreference not working [closed]正则表达式反向引用不起作用[关闭]
【发布时间】:2016-11-09 08:59:20
【问题描述】:

我想匹配这个类似 html 的模式:<12>Some content with \n in it<12>

重要的是只标记完整的项目(数字必须匹配),这意味着当缺少一个标签时,不应标记内容。 <12>Some content with \n in it<13>test<13>

这是我目前得到的:

(<\s*[0-9]+\>)(.*?[^<]*?)(<\s*[0-9]+\>)

这是我期望它应该起作用但实际上它没有:

(<\s*[0-9]+\>)(.*?[^<]*?)(<\s*[0-9]+\>)\1

我尝试使用此编辑器,但反向引用没有按预期工作。为什么对第一个捕获组的反向引用不起作用?该解决方案应该在 C++ 中运行。

http://regexr.com/3ek1a

【问题讨论】:

  • 在你使用它的地方显示代码。顺便说一句,您使用第二个&lt;\s*[0-9]+&gt; 的标签。试试(&lt;\s*[0-9]+&gt;)([^&lt;]*)\1,见this demo
  • C 和 C++ 不是同一种语言。
  • 您使用 C 还是 C++ 工作?答案是非常、非常、完全不同的。 C++在标准库中有正则表达式; C 没有。如果您使用 C 进行编程,那么问题就变成了“您使用的是哪个正则表达式包”。如果您使用 C++ 编程,那真的不是问题。您正在使用&lt;regex&gt;,除非有相反的特殊要求(如果存在,应在问题中明确说明)。
  • 我已经调整了问题。我需要它用于 C++。还没有代码,因为我想在实现之前检查我的想法是否有效!
  • 你为什么使用\s*?可以有&lt; 1&gt; text &lt; 1&gt;吗?如果是的话,可以有&lt;1&gt; text &lt; 1 &gt;吗?

标签: c++ regex tags backreference


【解决方案1】:

试试这个:

<\s*(\d+)\s*>((.|\n)*?)<\s*\1\s*>

Explanation

  1. 第一捕获组 (\d+)
  2. \d+ 匹配一个数字(等于 [0-9])
  3. +量词——匹配一次到无限次(贪心)
  4. (.|\n)*? .匹配任何字符(行终止符除外),并且 \n 匹配行终止符
  5. ?让它变得懒惰(懒惰)
  6. \1 反向引用第一个捕获组

C++14 代码示例:

#include <regex>
#include <string>
#include <iostream>
using namespace std;

int main()
{
    string regx = R"(<\s*(\d+)\s*>((.|\n)*?)<\s*\1\s*>)";
    string input = "<1>test1<1><2>Tes\nt2<2>sfsaf<3><4>test4<4>";
    smatch matches;
        while (regex_search(input, matches, regex(regx)))
        {
            cout<<matches[2]<<endl;
            input = matches.suffix().str();
        }
    return 0;
}

Run the code here

【讨论】:

  • 此解决方案无法识别问题中提到的换行符。
  • 更新了答案...我一开始没有注意到 \n ;) 立即尝试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多