Hier ist eine Lösung, die die Macht von boost::iostreams verwendet die Aufgabe in einem hohen Niveau zu lösen, aber immer noch sehr flexibel.
Für OPs Fall ist dies wahrscheinlich wie mit einem Vorschlaghammer, um eine Nuss zu knacken, aber wenn man Flexibilität braucht oder mit komplexeren Fällen umgehen muss, könnte es das richtige Werkzeug sein.
Ich verwende eine filtering stream kombiniert mit einer regular expression. Dies ermöglicht es uns, ein Suchmuster im laufenden Betrieb durch eine Ersatzzeichenfolge zu ersetzen, ohne eine Zwischenzeichenfolge zu erzeugen.
#include <iostream>
#include <string>
#include <sstream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/filter/regex.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/regex.hpp>
namespace io = boost::iostreams;
using namespace std;
int main()
{
// Your input "file" - you may replace it by an std::ifstream object.
istringstream in("why waste time learning learninglearning, when ignorance is instantaneous?");
// Search pattern and substitution string.
string findRegEx(R"(\blearning\b)");
string replaceStr("sleeping");
// Build a regular expression filter and attach it to the input stream.
io::filtering_istream inFiltered;
inFiltered.push(io::regex_filter(boost::regex(findRegEx), replaceStr));
inFiltered.push(in);
// Copy the filtered input to the output, replacing the search word on-the-fly.
// Replace "cout" by your output file, e. g. an std::ofstream object.
io::copy(inFiltered, cout);
cout << endl;
}
Live demo
Ausgang:
why waste time sleeping learninglearning, when ignorance is instantaneous?
Hinweise:
- Die tatsächliche regulärer Ausdruck ist
\blearning\b
- Wir müssen den Backslash nicht umgehen, weil wir eine raw string literal verwenden. Sehr ordentlich für solche Sachen. Der reguläre Ausdruck sucht nach dem ganzen Wort "Lernen" (
\b
bezeichnet eine Wortgrenze). Deshalb ersetzt es nur das erste Vorkommen von "Lernen" und nicht "Lernenlernen".
Beste Antwort bisher, weil diese Methode alle Leerzeichen erhält. –
Sie können Deklarationen nicht innerhalb von Ausdrücken platzieren. –
@yurikilochek, danke für den Hinweis auf den Fehler. –