2 Stimmen

Warum funktioniert diese Regex nicht für C++ TR1?

Ich gebe zu, es ist schon eine Weile her, dass ich mit C++ gearbeitet habe, aber soweit ich das beurteilen kann, sollte mein Code funktionieren. Ich versuche, alle Blockkommentare aus einer Datei mit Code zu ersetzen/entfernen. Ich habe die gesamte Datei, die ich suche, in eine Zeichenkette eingegeben, und die Zeichenkette enthält Zeilenumbruchzeichen.

Hier ist mein Code

std::tr1::regex rx1("[/][*][\S\s]*?[*][/]");
stringName = std::regex_replace(stringName, rx1, std::string(""));

Soweit ich das beurteilen kann, sollte dies mit /*alles, was hier drin steht, einschließlich neuer Zeilen */

Ich habe es sogar getestet an http://gskinner.com/RegExr/ , wo sie perfekt mit den Blockkommentaren übereinstimmt. Das Problem ist, dass die Blockkommentare nicht ersetzt werden. Ist dies eine Art TR1-spezifischer Fehler?

3voto

Man muss bedenken, dass das, was man tut, vielschichtig ist.

  • Zunächst bauen Sie eine Zeichenkette innerhalb eines Zeichenkettenliterales auf. Für einen Menschen sieht das wie ein regulärer Ausdruck aus, aber dem Zeichenfolgenliteral ist das egal.

    Dieses Zeichenfolgenliteral enthält unter anderem die Sonderzeichen, die von \S y \s bzw. (genau wie bei \n ist etwas Besonderes).

  • Dann übergeben Sie diese Zeichenfolge - mit allen Sonderzeichen - an die Regex-Engine.

Stattdessen müssen Sie die Backslashes entschlüsseln, nur für das String-Literal :

std::tr1::regex rx1("[/][*][\\S\\s]*?[*][/]")

Die Regex-Engine wird den Ausdruck dann richtig erkennen:

[/][*][\S\s]*?[*][/]

Außerdem würde ich prüfen, ob der Motor von tr1 Trennzeichen benötigt. Normalerweise sind sie eine gute Idee.

1voto

Brandon Punkte 1058

Lightness Races in Orbit hat mich auf den richtigen Weg gebracht, aber es stellte sich heraus, dass * und ? nicht für Argumente innerhalb von [] Klammern verwendet werden können. Der Weg, dies zu tun ist eine nicht-erfassende Gruppe, die oder Anweisungen hat.

Code zum Auffinden von mehrzeiligen Blockkommentaren:

std::tr1::regex rx3("[/][*](?:\s|.|\n)*?[*][/]");

(?:expression) ist die Art und Weise, wie man eine nicht-erfassende Gruppe erstellt. Sie können * und ? auf die Außenseite dieser Gruppe anwenden. Innerhalb davon, verwenden Sie | als eine oder-Anweisung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X