2017-04-19 2 views
2

Ich verwende das folgende Muster (?<=<)(?<!>).*?q.*?(?!<)(?=>), das positive und negative Lookahead und Lookbehind verwendet, um das Literal , das in übereinstimmenden Klammern eingeschlossen ist, zu entsprechen. C++ RegEx unterstützt nicht hinter Lookhed, was wäre eine gute Alternative? Vielen Dank!Was ist eine Alternative für Lookbehind mit C++ RegEx?

+1

Es ist ein sehr seltsames Muster, das nicht funktioniert, wenn es mehrere 'gibt'Teilstrings in der gleichen Zeile. Wenn Sie diese Regex noch benötigen, verwenden Sie '<(.*?q.*?)>' und greifen Sie auf 'smatch_obj.str (1)'. '<([^> q] * q [^>] *)>' wird jedoch besser und genauer sein. –

+0

"Boost" unterstützt, dass –

Antwort

2

Beachten Sie, dass (?<=<)(?<!>)-(?<=<) gleich ist (da ein < unmittelbar links von der aktuellen Position erforderlich ist, kann es keine > sein) und (?!<)(?=>) gleich (?=>) (gleiche Logik gilt auch hier, wie > sofort sein muss das Recht, es wird keine geben <). Die erste .*? wird nicht die kürzeste Teilzeichenfolge möglich, es wird buchstäblich seinen Weg zum ersten q finden, die mit allen Zeichen 0+ bis zum ersten > gefolgt wird. So funktioniert das Muster selbst im Lookbehind-unterstützenden Motor kaum.

ich eher <([^<>q]*q[^<>]*)> regex mit Erfassung Gruppe und wörtliche raubend < und > Symbole am Anfang/Ende des Ausdrucks verwenden würde: abq:

std::regex r("<([^<>q]*q[^<>]*)>"); 
std::string s = "<adqsdq<><abc>5<abq>6<qaz> <hjfffffffk>"; 
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r); 
         i != std::sregex_iterator(); 
         ++i) 
{ 
    std::cout << (*i).str(1) << srd::endl; 
} 

die C++ demo

Ausgang Siehe und qaz

+0

Dank Wiktor, Problem mit Ihrem Regex ist, dass es nicht berücksichtigt das Vorhandensein einer anderen Klammer so zum Beispiel "' sollte nicht übereinstimmen, weil es eine linke Klammer in einem Links/rechts ist. Ich hoffe, das macht Sinn – Joey

+0

OK, verwenden '<([^<> q] * q [^ <>] *)>'. [Deine Regex hat das nicht berücksichtigt] (https://regex101.com/r/EbY5ld/1). –

+0

Überprüfen Sie die Antwort jetzt, ich habe es mit einer Regex aktualisiert, die nicht mit der von Ihnen angegebenen Zeichenfolge übereinstimmt. –

Verwandte Themen