Replace first match
Use a combination of std::string::find
and std::string::replace
.
Find the first match:
std::string s; std::string toReplace("text to replace"); size_t pos = s.find(toReplace);
Replace the first match:
s.replace(pos, toReplace.length(), "new text");
A simple function for your convenience:
void replace_first( std::string& s, std::string const& toReplace, std::string const& replaceWith ) { std::size_t pos = s.find(toReplace); if (pos == std::string::npos) return; s.replace(pos, toReplace.length(), replaceWith); }
Usage:
replace_first(s, "text to replace", "new text");
Replace all matches
Define this O(n) method using std::ostringstream
as a buffer:
void replace_all( std::string& s, std::string const& toReplace, std::string const& replaceWith ) { std::ostringstream oss; std::size_t pos = 0; std::size_t prevPos = pos; while (true) { prevPos = pos; pos = s.find(toReplace, pos); if (pos == std::string::npos) break; oss << s.substr(prevPos, pos - prevPos); oss << replaceWith; pos += toReplace.size(); } oss << s.substr(prevPos); s = oss.str(); }
Usage:
replace_all(s, "text to replace", "new text");
Boost
Alternatively, use boost::algorithm::replace_all
:
#include <boost/algorithm/string.hpp> using boost::replace_all;
Usage:
replace_all(s, "text to replace", "new text");