Comment pourrais-je 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
Réponses:
Il n'y a pas une fonction intégrée en C ++ pour ce faire. 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
etstring::replace
. Par exemple:Dans la dernière ligne de ce code, j'ai incrémenté
index
de la longueur de la chaîne qui a été insérée dans la chaîne. Dans cet exemple particulier - remplacer"abc"
par"def"
- ce n'est pas réellement nécessaire. Cependant, dans un cadre plus général, il est important d'ignorer la chaîne qui vient d'être remplacée. Par exemple, si vous souhaitez remplacer"abc"
par"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 peut être légèrement plus rapide de sauter de toute façon ces nouveaux personnages, car cela permet d'économiser du temps et des efforts pour lastring::find
fonction.J'espère que cela t'aides!
la source
index
) au-delà de la partie de la chaîne qui a été remplacée.Boost String Algorithms Library manière:
la source
Dans c ++ 11, vous pouvez utiliser
std::regex_replace
:la source
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. (recherchez "abc" et remplacez-le par "xxxxxx") Une approche générale pourrait être:
la source
Où
str
est la chaîne de basestr2
est la sous-chaîne à trouverstr3
est la sous-chaîne de remplacementla source
Le remplacement des sous-chaînes ne devrait pas être si difficile.
Si vous avez besoin de performances, voici une fonction optimisée qui modifie la chaîne d'entrée, elle ne crée pas de copie de la chaîne:
Tests:
Production:
la source
if (search.empty()) { return; }
pour éviter une boucle infinie lorsque vous passez une recherche videComme ce n'est pas un membre de la
string
classe, cela ne permet pas une syntaxe aussi agréable que dans votre exemple, mais ce qui suit fera l'équivalent:la source
Généralisant sur la réponse de rotmax, voici une solution complète pour rechercher et remplacer toutes les instances d'une chaîne. Si les deux sous-chaînes sont de taille différente, la sous-chaîne est remplacée en utilisant string :: erase et string :: insert., Sinon la chaîne la plus rapide :: replace est utilisée.
la source
Si vous êtes sûr que la sous-chaîne requise est présente dans la chaîne, cela remplacera la première occurrence de
"abc"
to"hij"
Il plantera si vous n'avez pas "abc" dans le test, alors utilisez-le avec précaution.
la source
Voici une solution que j'ai écrite en utilisant la tactique du constructeur:
Tests:
la source
Je pense que cela correspond à vos besoins avec peu de code!
la source
la version améliorée par @Czarek Tomczak.
permettre à la fois
std::string
etstd::wstring
.la source
la source
Voici une solution utilisant la récursivité qui remplace toutes les occurrences d'une sous-chaîne par une autre sous-chaîne. Cela fonctionne quelle que soit la taille des chaînes.
Exemple d'utilisation:
la source
Solution courte où vous n'avez pas besoin de bibliothèques supplémentaires.
la source
la source