/ / Riferimento indietro Regex non funziona [chiuso] - c ++, regex, tag, backreference

Backreference Regex non funziona [chiuso] - c ++, regex, tag, backreference

Voglio abbinare questo modello html: <12>Some content with n in it<12>

Importante è che solo gli elementi completi sono contrassegnati (i numeri DEVONO corrispondere), significa che quando manca un tag il contenuto non deve essere contrassegnato. <12>Some content with n in it<13>test<13>

Questo è quello che ho ottenuto finora:

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

Questo è quello che mi aspetto che dovrebbe funzionare ma in realtà non lo fa:

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

Ho provato con questo editor ma il backreference non funziona come mi aspetto. Perché il backreference verso il primo gruppo di acquisizione non funziona? La soluzione dovrebbe funzionare in C ++.

http://regexr.com/3ek1a

risposte:

3 per risposta № 1

Prova questo:

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

Spiegazione

  1. 1 ° gruppo di cattura (d +)
  2. d + corrisponde a una cifra (uguale a [0-9])
  3. + Quantificatore - Partite tra uno e illimitate volte (goloso)
  4. (|. N) *? . corrisponde a qualsiasi carattere (eccetto per i terminatori di riga) e n corrisponde ai terminatori di riga
  5. ? lo rende pigro (pigro)
  6. 1 backreference al primo gruppo di cattura

Esempio di codice 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;
}

Esegui il codice qui