Comment trouver et remplacer toutes les occurrences d’une sous-chaîne dans une chaîne?

J’ai besoin de rechercher une chaîne et d’éditer sa mise en forme.

Jusqu’à présent, je peux remplacer la première occurrence de la chaîne, mais je ne peux pas le faire avec les occurrences suivantes de cette chaîne.

Voici ce que je travaille, en quelque sorte:

if(chartDataSsortingng.find("*A") == ssortingng::npos){ return;} else{chartDataSsortingng.replace(chartDataSsortingng.find("*A"), 3,"[A]\n");} 

S’il ne trouve pas la chaîne, rien ne s’imprime, alors ce n’est pas bon.

Je sais que je dois parcourir toute la chaîne chartDataSsortingng et remplacer toutes les occurrences. Je sais qu’il y a beaucoup de publications similaires à cela mais je ne comprends pas (comme ceci Remplacez la sous-chaîne par une autre sous-chaîne C ++ )

J’ai aussi essayé de faire quelque chose comme ceci pour boucler la chaîne:

 ssortingng toSearch = chartDataSsortingng; ssortingng toFind = "*A:"; for (int i = 0; i<toSearch.length() - toFind.length(); i++){ if(toSearch.substr(i, toFind.length()) == toFind){ chartDataString.replace(chartDataString.find(toFind), 3, "[A]\n"); } } 

EDIT prenant en considération les suggestions, ceci devrait théoriquement fonctionner, mais je ne sais pas pourquoi cela ne fonctionne pas

 size_t startPos=0; ssortingng mySsortingng = "*A"; while(ssortingng::npos != (startPos = chartDataSsortingng.find(mySsortingng, startPos))){ chartDataSsortingng.replace(chartDataSsortingng.find(mySsortingng, startPos), 3, "*A\n"); startPos = startPos + mySsortingng.length(); } 

essayez ce qui suit

 const std::ssortingng s = "*A"; const std::ssortingng t = "*A\n"; std::ssortingng::size_type n = 0; while ( ( n = chartDataSsortingng.find( s, n ) ) != std::ssortingng::npos ) { chartDataSsortingng.replace( n, s.size(), t ); n += t.size(); } 

Si le boost est disponible, vous pouvez utiliser les éléments suivants:

 std::ssortingng origStr = "this ssortingng has *A and then another *A"; std::ssortingng subSsortingngToRemove = "*A"; std::ssortingng subSsortingngToReplace = "[A]"; boost::replace_all(origStr , subSsortingngToRemove , subSsortingngToReplace); 

Pour effectuer la modification sur la chaîne d’origine, OU

 std::ssortingng result = boost::replace_all_copy(origStr , subSsortingngToRemove , subSsortingngToReplace); 

Pour effectuer les modifications sans modifier la chaîne d’origine.

J’espère que ça aide.

À votre santé,

Gars

La fonction de find prend un deuxième argument facultatif: la position à partir de laquelle commencer la recherche. Par défaut, c’est zéro.

Une bonne position pour commencer à chercher le prochain match est la position dans laquelle le remplacement précédent a été inséré, plus la longueur de ce remplacement. Par exemple, si nous insérons une chaîne de longueur 3 en position 7, la find suivante doit commencer à la position 10.

Si la chaîne de recherche se trouve être une sous-chaîne du remplacement, cette approche évitera une boucle infinie. Imaginez si vous essayez de remplacer toutes les occurrences de log par analog , mais ne sautez pas le remplacement.

C’est assez maladroit (et probablement pas trop efficace) de le faire en place. J’utilise généralement une fonction dans le sens de:

 std::ssortingng replaceAll( std::ssortingng const& original, std::ssortingng const& from, std::ssortingng const& to ) { std::ssortingng results; std::ssortingng::const_iterator end = original.end(); std::ssortingng::const_iterator current = original.begin(); std::ssortingng::const_iterator next = std::search( current, end, from.begin(), from.end() ); while ( next != end ) { results.append( current, next ); results.append( to ); current = next + from.size(); next = std::search( current, end, from.begin(), from.end() ); } results.append( current, next ); return results; } 

Fondamentalement, vous faites une boucle tant que vous pouvez trouver une instance de from , en ajoutant le texte intermédiaire et to , et en passant à la prochaine instance de from . À la fin, vous ajoutez un texte après la dernière instance de from .

(Si vous envisagez beaucoup de programmation en C ++, c’est probablement une bonne idée de vous habituer à utiliser des iterators, comme ci-dessus, plutôt que les fonctions membres spéciales de std::ssortingng . avec tous les types de conteneurs C ++, et pour cette raison, sont plus idiomatiques.)

 /// Returns a version of 'str' where every occurrence of /// 'find' is substituted by 'replace'. /// - Inspired by James Kanze. /// - http://stackoverflow.com/questions/20406744/ std::ssortingng replace_all( const std::ssortingng & str , // where to work const std::ssortingng & find , // substitute 'find' const std::ssortingng & replace // by 'replace' ) { using namespace std; ssortingng result; size_t find_len = find.size(); size_t pos,from=0; while ( ssortingng::npos != ( pos=str.find(find,from) ) ) { result.append( str, from, pos-from ); result.append( replace ); from = pos + find_len; } result.append( str, from , ssortingng::npos ); return result; /* This code might be an improvement to James Kanze's because it uses std::ssortingng methods instead of general algorithms [as 'std::search()']. */ } int main() { { std::ssortingng test = "*A ... *A ... *A ..."; std::ssortingng changed = "*A\n ... *A\n ... *A\n ..."; assert( changed == replace_all( test, "*A", "*A\n" ) ); } { std::ssortingng GB = "My gorila ate the banana"; std::ssortingng gg = replace_all( GB, "gorila", "banana" ); assert( gg == "My banana ate the banana" ); gg = replace_all( gg, "banana", "gorila" ); assert( gg == "My gorila ate the gorila" ); std::ssortingng bb = replace_all( GB, "banana", "gorila" ); assert( gg == "My gorila ate the gorila" ); bb = replace_all( bb, "gorila" , "banana" ); assert( bb == "My banana ate the banana" ); } { std::ssortingng str, res; str.assign( "ababaabcd" ); res = replace_all( str, "ab", "fg"); assert( res == "fgfgafgcd" ); str="aaaaaaaa"; assert( 8==str.size() ); res = replace_all( str, "aa", "a" ); assert( res == "aaaa" ); assert( "" == replace_all( str, "aa", "" ) ); str = "aaaaaaa"; assert( 7==str.size() ); res = replace_all( str, "aa", "a" ); assert( res == "aaaa" ); str = "..aaaaaa.."; assert( 10==str.size() ); res = replace_all( str, "aa", "a" ); assert( res == "..aaa.." ); str = "baaaac"; assert( 6==str.size() ); res = replace_all( str, "aa", "" ); assert( res == "bc" ); } }