143 votes

Remplacer une sous-chaîne par une autre sous-chaîne C++

Comment remplacer une sous-chaîne dans une chaîne par une autre sous-chaîne en C++, quelles fonctions puis-je utiliser ?

eg: string test = "abc def abc def";
test.replace("abc", "hij").replace("def", "klm"); //replace occurrence of abc and def with other substring

127voto

Jingguo Yao Points 513

Sur c++11 vous pouvez utiliser std::regex_replace :

#include <string>
#include <regex>

std::string test = "abc def abc def";
test = std::regex_replace(test, std::regex("def"), "klm"); // replace 'def' -> 'klm'
// test = "abc klm abc klm"

105voto

templatetypedef Points 129554

Il n'y a pas de fonction intégrée en C++ pour faire cela. Si vous souhaitez remplacer toutes les instances d'une sous-chaîne par une autre, vous pouvez le faire en mélangeant les appels à string::find y string::replace . Par exemple :

size_t index = 0;
while (true) {
     /* Locate the substring to replace. */
     index = str.find("abc", index);
     if (index == std::string::npos) break;

     /* Make the replacement. */
     str.replace(index, 3, "def");

     /* Advance index forward so the next iteration doesn't pick it up as well. */
     index += 3;
}

Dans la dernière ligne de ce code, j'ai incrémenté index par la longueur de la chaîne qui a été insérée dans la chaîne. Dans cet exemple particulier - remplacer "abc" con "def" - cela n'est pas vraiment nécessaire. Cependant, dans un cadre plus général, il est important de sauter la chaîne qui vient d'être remplacée. Par exemple, si vous voulez remplacer "abc" con "abcabc" sans sauter le segment de chaîne nouvellement remplacé, ce code remplacerait continuellement des parties des chaînes nouvellement remplacées jusqu'à ce que la mémoire soit épuisée. Indépendamment, il pourrait être légèrement plus rapide de sauter ces nouveaux caractères de toute façon, puisque cela permet d'économiser un peu de temps et d'effort de la part de l'utilisateur. string::find fonction.

J'espère que cela vous aidera !

79voto

Oleg Svechkarenko Points 994

Bibliothèque d'algorithmes de chaînes Boost manière :

#include <boost/algorithm/string/replace.hpp>

{ // 1. 
  string test = "abc def abc def";
  boost::replace_all(test, "abc", "hij");
  boost::replace_all(test, "def", "klm");
}

{ // 2.
  string test = boost::replace_all_copy
  (  boost::replace_all_copy<string>("abc def abc def", "abc", "hij")
  ,  "def"
  ,  "klm"
  );
}

55voto

Jeff Zacher Points 21
str.replace(str.find(str2),str2.length(),str3);

  • str est la chaîne de base
  • str2 est la sous-chaîne à trouver
  • str3 est la sous-chaîne de remplacement

51voto

rotmax Points 121

Je pense que toutes les solutions échoueront si la longueur de la chaîne de remplacement est différente de la longueur de la chaîne à remplacer. (rechercher "abc" et remplacer par "xxxxxx") Une approche générale pourrait être la suivante :

void replaceAll( string &s, const string &search, const string &replace ) {
    for( size_t pos = 0; ; pos += replace.length() ) {
        // Locate the substring to replace
        pos = s.find( search, pos );
        if( pos == string::npos ) break;
        // Replace by erasing and inserting
        s.erase( pos, search.length() );
        s.insert( pos, replace );
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X