如何在标准string中search/查找和replace?

有没有办法用std::string另一个stringreplace所有的子std::string

例如:

 void SomeFunction(std::string& str) { str = str.replace("hello", "world"); //< I'm looking for something nice like this } 

为什么不实施自己的replace?

 void myReplace(std::string& str, const std::string& oldStr, const std::string& newStr) { std::string::size_type pos = 0u; while((pos = str.find(oldStr, pos)) != std::string::npos){ str.replace(pos, oldStr.length(), newStr); pos += newStr.length(); } } 
 #include <boost/algorithm/string.hpp> // include Boost, a C++ library ... std::string target("Would you like a foo of chocolate. Two foos of chocolate?"); boost::replace_all(target, "foo", "bar"); 

这里是关于replace_all 的官方文档 。
这是我在2010年提出的关于Boost Stringalgorithm的演示文稿 。

为什么不返回修改过的string?

 std::string ReplaceString(std::string subject, const std::string& search, const std::string& replace) { size_t pos = 0; while((pos = subject.find(search, pos)) != std::string::npos) { subject.replace(pos, search.length(), replace); pos += replace.length(); } return subject; } 

如果你需要性能,这是一个优化的函数,它修改inputstring,它不会创buildstring的副本:

 void ReplaceStringInPlace(std::string& subject, const std::string& search, const std::string& replace) { size_t pos = 0; while((pos = subject.find(search, pos)) != std::string::npos) { subject.replace(pos, search.length(), replace); pos += replace.length(); } } 

testing:

 std::string input = "abc abc def"; std::cout << "Input string: " << input << std::endl; std::cout << "ReplaceString() return value: " << ReplaceString(input, "bc", "!!") << std::endl; std::cout << "ReplaceString() input string not changed: " << input << std::endl; ReplaceStringInPlace(input, "bc", "??"); std::cout << "ReplaceStringInPlace() input string modified: " << input << std::endl; 

输出:

 Input string: abc abc def ReplaceString() return value: a!! a!! def ReplaceString() input string not modified: abc abc def ReplaceStringInPlace() input string modified: a?? a?? def 

在C ++ 11中,你可以通过调用regex_replace来做到这一点:

 #include <string> #include <regex> using std::string; string do_replace( string const & in, string const & from, string const & to ) { return std::regex_replace( in, std::regex(from), to ); } string test = "Remove all spaces"; std::cout << do_replace(test, " ", "") << std::endl; 

输出:

 Removeallspaces 

我的模板化内联就地查找和replace:

 template<class T> int inline findAndReplace(T& source, const T& find, const T& replace) { int num=0; typename T::size_t fLen = find.size(); typename T::size_t rLen = replace.size(); for (T::size_t pos=0; (pos=source.find(find, pos))!=T::npos; pos+=rLen) { num++; source.replace(pos, fLen, replace); } return num; } 

它返回被replace的项目数量(如果你想连续运行这个等等)。 要使用它:

 std::string str = "one two three"; int n = findAndReplace(str, "one", "1"); 

最简单的方法(提供你所写的东西)是使用Boost.Regex ,特别是regex_replace 。

std :: string内置了find()和replace()方法,但是它们处理起来更麻烦,因为它们需要处理索引和string长度。

我相信这会起作用。 它需要const char *作为参数。

 //params find and replace cannot be NULL void FindAndReplace( std::string& source, const char* find, const char* replace ) { //ASSERT(find != NULL); //ASSERT(replace != NULL); size_t findLen = strlen(find); size_t replaceLen = strlen(replace); size_t pos = 0; //search for the next occurrence of find within source while ((pos = source.find(find, pos)) != std::string::npos) { //replace the found string with the replacement source.replace( pos, findLen, replace ); //the next line keeps you from searching your replace string, //so your could replace "hello" with "hello world" //and not have it blow chunks. pos += replaceLen; } } 
 #include <iostream> #include <string> #include <boost/algorithm/string.hpp> #include <boost/tokenizer.hpp> #include <boost/foreach.hpp> using namespace boost::algorithm; using namespace std; using namespace boost; void highlighter(string terms, string text) { char_separator<char> sep(" "); tokenizer<char_separator<char> > tokens(terms, sep); BOOST_FOREACH(string term, tokens) { boost::replace_all(text, term, "<b>" + term + "</b>"); } cout << text << endl; } int main(int argc, char **argv) { cout << "Search term highlighter" << endl; string text("I love boost library, and this is a test of boost library!"); highlighter("love boost", text); } 

喜欢 提升库,这是一个提升库的testing!

 // Replace all occurrences of searchStr in str with replacer // Each match is replaced only once to prevent an infinite loop // The algorithm iterates once over the input and only concatenates // to the output, so it should be reasonably efficient std::string replace(const std::string& str, const std::string& searchStr, const std::string& replacer) { // Prevent an infinite loop if the input is empty if (searchStr == "") { return str; } std::string result = ""; size_t pos = 0; size_t pos2 = str.find(searchStr, pos); while (pos2 != std::string::npos) { result += str.substr(pos, pos2-pos) + replacer; pos = pos2 + searchStr.length(); pos2 = str.find(searchStr, pos); } result += str.substr(pos, str.length()-pos); return result; }