C+中的字符串替换+; 我花了一个半小时来尝试如何在C++中使用字符串对象进行简单的搜索和替换。

C+中的字符串替换+; 我花了一个半小时来尝试如何在C++中使用字符串对象进行简单的搜索和替换。,c++,macos,string,C++,Macos,String,我有三个字符串对象 string original, search_val, replace_val; 我想在original上为search\u val运行搜索命令,并用replace\u val替换所有出现的内容 Nb:纯C++中的答案。环境是Mac OSX Leopard上的XCode。循环应该与查找和替换一起工作 size_t start = 0; while(1) { size_t where = original.find(search_val, start); if(

我有三个字符串对象

string original, search_val, replace_val;
我想在
original
上为
search\u val
运行搜索命令,并用
replace\u val
替换所有出现的内容


<强> Nb:<强>纯C++中的答案。环境是Mac OSX Leopard上的XCode。

循环应该与查找和替换一起工作

size_t start = 0;
while(1) {
  size_t where = original.find(search_val, start);
  if(where==npos) {
    break;
  }
  original.replace(where, search_val.size(), replace_val);
  start = where + replace_val.size();
}
void searchAndReplace(std::string& value, std::string const& search,std::string const& replace)
{
    std::string::size_type  next;

    for(next = value.find(search);        // Try and find the first match
        next != std::string::npos;        // next is npos if nothing was found
        next = value.find(search,next)    // search for the next match starting after
                                          // the last match that was found.
       )
    {
        // Inside the loop. So we found a match.
        value.replace(next,search.length(),replace);   // Do the replacement.
        next += replace.length();                      // Move to just after the replace
                                                       // This is the point were we start
                                                       // the next search from. 
    }
}

为了便于比较,这里是纯C中的函数:
稍微优雅一点:

void searchAndReplace(std::string& value, std::string const& search,std::string const& replace) {
    for(std::string::size_type idx = value.find(search);match
        idx != std::string::npos;        
        next = value.find(search, idx + replace.size())   
    )
        value.replace(next, search.size(), replace);
}
简单的。。。 但仅限于替换单个字符

#include <algorithm>
string foo = "abc.e";
std::replace(foo.begin(), foo.end(),'.','d');

result --> foo = "abcde";
#包括
字符串foo=“abc.e”;
std::replace(foo.begin(),foo.end(),'d');
结果-->foo=“abcde”;

这可能会加快执行速度,并在需要时保留原始版本

static std::string strreplace( const std::string &original, const std::string &pattern, const std::string &newtext ) {
std::stringstream ss;           
std::string::size_type last = 0;
std::string::size_type it = original.find( pattern, last );
while( it != original.npos ) {
    if( it-last > 0 ) {
        ss << original.substr( last, it - last );
        ss << newtext;
    }
    last = it + pattern.size( );                
    it = original.find( pattern, last );
}
return ss.str( );
静态标准::字符串标准替换(常量标准::字符串和原始,常量标准::字符串和模式,常量标准::字符串和新文本){
std::stringstream-ss;
std::string::size\u type last=0;
std::string::size\u type it=original.find(pattern,last);
while(it!=original.npos){
如果(最后一次>0){

ss这可能是您最集中的字符串替换版本:

for ( string::size_type index = 0 ;
                       (index = value.find(from, index)) != string::npos ;
                       index += to.size() )
    value.replace(index, from.size(), to);

经过测试的代码和示例

如果要返回字符串,请使用以下命令:

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;
}
如果需要性能,这里有一个修改输入字符串的优化函数,它不会创建字符串的副本:

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();
    }
}
测试:

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;

这是一个很小的错误,但是你的函数名有一个拼写错误(“Repalce”),这在你的代码中似乎有点不合适,非常优雅,格式也很好。@Levy:一个人只能努力追求完美,但实现它是神的领域(因此,如果我唯一的错误是拼写,我很高兴)。我同意这是一段简单的代码。我唯一的建议是不要对参数/变量使用动词,因为它们看起来像函数名(replace甚至是函数名)。因此,replace()调用可以读取类似target.replace(下一步,search_string.length(),replacement)的内容短语“字符串插值”是什么意思是?我在你提供的链接的标题中找到了。如果你查找“interpolate”,你应该会得到一个描述。例如,shell变量interpolation是将$name替换为“value”的过程。
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();
    }
}
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