/ / Odwołanie zwrotne Regex nie działa [closed] - c ++, regex, tags, backreference

Brak referencji zwrotnej Regex [closed] - c ++, regex, tags, backreference

Chcę dopasować ten wzorzec podobny do html: <12>Some content with n in it<12>

Ważne jest, aby zaznaczyć tylko pełne pozycje (numery MUSZĄ pasować), oznacza to, że gdy brakuje jednego tagu, zawartość nie powinna być oznaczona. <12>Some content with n in it<13>test<13>

Oto, co do tej pory osiągnąłem:

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

Oczekuję, że to zadziała, ale w rzeczywistości tak nie jest:

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

Próbowałem z tym edytorem, ale wsteczna referencja nie działa tak, jak się spodziewam. Dlaczego referencje zwrotne do pierwszej grupy przechwytującej nie działają? Rozwiązanie powinno działać w C ++.

http://regexr.com/3ek1a

Odpowiedzi:

3 dla odpowiedzi № 1

Spróbuj tego:

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

Wyjaśnienie

  1. Pierwsza grupa przechwytująca (d +)
  2. d + dopasowuje cyfrę (równą [0-9])
  3. + Kwantyfikator - Mecze pomiędzy jednym a nieograniczonym czasem (chciwe)
  4. (. | n) *? . dopasowuje dowolny znak (z wyjątkiem terminatorów linii) i n dopasowuje terminatory linii
  5. ? sprawia, że ​​jest leniwy (leniwy)
  6. 1 zwrotna referencja do pierwszej grupy przechwytującej

Próbka kodu C ++ 14:

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

int main()
{
string regx = R"(<s*(d+)s*>((.|n)*?)<s*1s*>)";
string input = "<1>test1<1><2>Tesnt2<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;
}

Uruchom tutaj kod