我想匹配这个类似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 ++中工作。
答案 0 :(得分:3)
试试这个:
<\s*(\d+)\s*>((.|\n)*?)<\s*\1\s*>
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;
}