Regex Ausnahme: Sonderzeichen ignorieren
-
Hi!
Ich habe ein Problem mit Boost::Regex. Ich will mit der Funktion merge() eine gewisse Zeichenfolge in einem String durch eine andere Zeichenfolge ersetzen. Jedoch enthält die Zeichenfolge die ersetzt werden soll Regex-Sonderzeichen.
Hier mein Code:boost::regex alte_version("$$$", boost::regbase::normal | boost::regbase::icase); sDatei_inhalt[count]=boost::regex_merge( sDatei_inhalt[count], alte_version, "!!!");
Das Problem hierbei ist, dass ich nicht einfach ein Backslash vor die Sonderzeichen machen kann. Hat jemand eine lösung, wie ich Regex dazu veranlassen kann, Sonderzeichen als normale Zeichen zu behandeln?
Vielen Dank schonmal für eure Hilfe!!!!
-
Vielleicht habe ich mein Ziel noch nicht genug beschrieben:
Ich will, dass Regex-Sonderzeichen wie zum Beispiel:$ oder . wie normale Zeichen behandelt werden. Wie ist das möglich in der Funktion da oben???Sry für Doppelpost!!!!
-
keine regexp verwenden oder den string vorher escapen
-
Ich bin leider auf Regex angewiesen. Was meinste denn damit, den String zu escapen???
-
Problemator schrieb:
Was meinste denn damit, den String zu escapen???
bevor du de String an die regex-Methode uebergibst allen Sonderzeichen einen Backslash vor die Nase knallen
-
Wenn du mit Escapen meinst \ vor die $-Zeichen zu schreiben, das geht leider nicht, da die Dateien wieder abgespeichert werden. Und wenn man sie abspeichert werden dann die \ mitgespeichert, weil bei dieser Funktion nur beim Suchen des Strings Reges benutzt wird.
-
Eine minute zu spät geantwortet:-)
Wie gesagt das geht leider nicht. Gibt es keine möglichkeit die Funktion merge() ohne die Regex Sonderzeichen zu benutzen?
-
Problemator schrieb:
Eine minute zu spaet geantwortet:-)
Wie gesagt das geht leider nicht. Gibt es keine moeglichkeit die Funktion merge() ohne die Regex Sonderzeichen zu benutzen?welchen Text hast du, welche regexp verwendest du und was willst du mit dem Text machen?
-
Gerade als ich auf den "Absenden" Button geklickt habe, ist irgendwie das Forum weggelaggt -.- egal von neuen:
Also ich habe einen String der von einer Datei eingelesen wird. In diesem String suche ich folgendes Keyword: "" ein Sonderzeichen ist. Ich habe es bereits ohne das "$"-Zeichen probiert und es funktioniert alles wunderbar. Hier ist die Regexp:boost::regex alte_version_sOption2("$keyword1", boost::regbase::normal | boost::regbase::icase);
Und das hier ist die merge() Funktion die das Wort sucht und ersetzt:
sDatei_inhalt[count]=boost::regex_merge( sDatei_inhalt[count], alte_version_sOption2, sKeyword[count2]+sVersionsnummer_neu);
-
Was ist eigentlich bitte
regex_merge
? Das heisst dochregex_replace
!
Und du willst alle $$$ durch !!! ersetzen? Geht doch ganz einfach:#include <boost/regex.hpp> #include <string> #include <iostream> std::string foo(std::string const& text) { boost::regex replaceRegex("(\\$\\$\\$)"); std::string replaceFormat("(?1!!!)"); return boost::regex_replace(text, replaceRegex, replaceFormat, boost::regex_constants::format_all); } int main() { std::cout << foo("This is a test$$$ I got 5$, w00t$$$") << std::endl; // Ergibt: This is a test!!! I got 5$, w00t!!! return 0; }
Grüssli
-
Nochmal als anmerkung: Mit dem \ ist es nicht zu lösen weil der String nacher wieder in die Datei gespeichert wird. Dann wird nämlich das \ mitgespeichert. Vll. gibt es ja eine möglichkeit das zu verhindern. Dann wäre mein problem auch gelöst!
-
Leuchtet mir nicht ein, Dein Problem.
Der zu durchsuchende String wird doch nicht als regulärer Ausdruck behandelt, sondern als das was er ist: Ein ganz normaler String, der durchsucht werden soll. Da bleibt ein $ ein $ und wird nicht zu einem Regex-Steuerzeichen. Wäre auch reichlich sinnlos...
-
Mir auch nicht ...
@Probelemator,
Versuch mein Beispiel auf Seite 1 aus. Da bleiben keine \ übrig, die verschwinden alle, so wie es sich gehört.Grüssli
-
Ja aber die suche mache ich doch mird der Regex-Funktion "merge()" und da muss man einen regulären ausdruck angeben. wenn ich jetzt den String: "$Key hallodfsfadsfadfasd sfdafaf" nach dem wort: $Key durchsuche ist $ für die funktion merge ein spnderzeichen und wird nicht mitgesucht. wenn ich jetzt \vor das $ mache danbn findet er es alles wurnderbar. nur will ich da das gleich keyword mit wieder reinschreiben nur dass dahinter noch mehr steht. also vorher stand da: "$Key hallodfsfadsfadfasd sfdafaf" und ich replace das key durch \\key hallo hallo. dann steht im string aber auch "\$Key hallo hallo dfsfadsfadfasd sfdafaf".
Deshalb suche ich nahc einer anderen Lösung. Versteht ihr mein Problem nun??? xDAlso nochmal kurz: Das eigentlich Problem ist, dass ich das keywort, dass ich suche auch wieder durch das keywort nur mit etwas noch hintendrann ersetze. also wenn ich nach \key suche schreibt er auch wieder \\key rein.
-
So, jetzt habe ich endlich rausgefunden, was regex_merge ist. Nun weiss ich auch, was dein Problem ist. regex_merge wurde vor !5! Jahren als deprecated erklärt. Deine Boost Version muss bei 1.30.x liegen und man verwendet inzwischen schon 1.35.0, bzw. womöglich bald 1.36.0. Wäre ein Update nicht mal langsam an der Zeit?
Ich kann dir mit regex_merge leider gar nicht helfen, da ich gar keine Dokumentation mehr dazu finde. Also keine Ahnung, wie oder warum es bei dir Probleme gibt.
Wenn du kannst, hol dir die neue Boost Version. Dort funktioniert es so, wie ich es gezeigt habe.Grüssli