正则表达式反向引用不起作用

时间:2016-11-09 08:59:21

标签: c++ regex tags backreference

我想匹配这个类似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

1 个答案:

答案 0 :(得分:3)

试试这个:

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

Explanation

  1. 第一捕获组(\ d +)
  2. \ d +匹配一个数字(等于[0-9])
  3. + Quantifier - 在一次和无限次之间匹配(贪婪)
  4. (|。\ n)的*? 。匹配任何字符(行终止符除外)和\ n 匹配行终止符
  5. ?让它变得懒惰(懒惰)
  6. \ 1反向引用第一个捕获组
  7. 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