Regex обратная ссылка не работает

Я хочу соответствовать этому 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

Решение

Попробуй это:

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

объяснение

  1. 1-я группа захвата (\ d +)
  2. \ d + соответствует цифре (равно [0-9])
  3. +Quantifier — соответствует от одного до неограниченного времени (жадный)
  4. (|. \ П) *? , соответствует любому символу (кроме разделителей строки) и \ 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;
}

Запустите код здесь

3

Другие решения

Других решений пока нет …