11
votes

String Remplacer en C ++

J'ai passé la dernière heure et demie en essayant de déterminer comment exécuter une recherche simple et remplacer sur un objet string en C ++.

J'ai trois objets de chaîne. xxx

Je veux exécuter une commande de recherche sur original pour le Search_val et remplacer toutes les occurrences avec remplaforme_val .

NB: réponses à Pure C ++ uniquement. L'environnement est Xcode sur le Mac OSX Leopard.


0 commentaires

9 Réponses :


4
votes
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();
}

0 commentaires

32
votes

Une boucle doit fonctionner avec Rechercher et remplacer

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. 
    }
}


3 commentaires

C'est un petit nit à choisir, mais votre nom de fonction a une faute de frappe ("repalce") qui semble un peu hors de place dans votre code, très élégant et bien formaté, code.


@Levy: On ne peut que s'efforcer de la perfection, mais l'atteinte est le domaine des divinités (donc si ma seule erreur est l'orthographe que je suis heureux).


Je suis d'accord c'est un élément élégant de code. Ma seule recommandation est de ne pas utiliser de verbes pour vos paramètres / variables car ils ressemblent à un nom de la fonction (Remplacer Même est un nom de la fonction). Donc votre appel remplacé () pourrait lire quelque chose comme cible.replace (suivant, Search_string.length (), remplacement)



1
votes

Pour la comparaison Voici la fonction de Pure C: http://www.pixelbeat.org/libs/string_replace.c


2 commentaires

Qu'est-ce que la phrase "interpolation de chaîne" signifie? Je l'ai trouvé dans l'en-tête du lien que vous avez fourni.


Si vous recherchez «Interpoler», vous devriez obtenir une description. Par exemple, l'interpolation variable de Shell est le processus de remplacement du nom de $ avec "valeur".



1
votes

Un peu plus élégant: xxx


0 commentaires

0
votes

Simple ...

mais limité à remplacer un seul caractère unique !! xxx


0 commentaires

1
votes
boost::replace_all(original, search_val, replace_val);

0 commentaires

0
votes

Cela pourrait entraîner une exécution plus rapide et préserve l'original si vous le souhaitez.

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( );


0 commentaires

0
votes

Ceci est probablement votre version la plus concentrée de chaîne remplacer: xxx


0 commentaires

0
votes

Code testé avec des exemples.

Si vous souhaitez que la chaîne renvoyée utilisez ceci: xxx

Si vous avez besoin de performances, une fonction optimisée qui modifie l'entrée. String, il ne crée pas une copie de la chaîne: xxx

tests: xxx

sortie: xxx


0 commentaires