Remplacement d'un motif dans une chaine de caractères

Remplacement d'un motif dans une chaine de caractères - C++ - Programmation

Marsh Posté le 24-06-2010 à 09:13:08    

Bonjour,
 
Je souhaite trouver une méthode efficace en terme de rapidité pour remplacer un motif apparaissant plusieurs fois dans une chaine de caractères.
ex:
"blabla $tag$ bla bla bla $tag$ $tag$".
->remplacer tous les $tag$ par "toto".
 
Pour l'instant, j'ai fait de cette façon:
 

Code :
  1. std::string replaceAll(std::string& source,const std::string& pattern,const std::string& value)
  2. {
  3.    size_t found;
  4.    while((found=source.find(pattern))!=string::npos)
  5.    {
  6.    source.replace(found,pattern.size(),value);
  7.    }
  8. }


 
Mais ça me paraît hautement inefficace (je re-parse la chaine de caractères en entier à chaque fois)
 
En Java, j'aurai fait un source.split($tag$) et j'aurai ensuite fait un StringBuffer pour reconcaténer en plaçant ma value entre les morceaux, quitte à payer le prix d'une copie à la fin.
 
Vous avez une meilleure solution en C++? Par exemple une méthode toute faite de la librairie STL?

Reply

Marsh Posté le 24-06-2010 à 09:13:08   

Reply

Marsh Posté le 24-06-2010 à 09:30:27    

Pourquoi tu ne repars pas de found dans ton find ?
 
De tête :

Code :
  1. std::string replaceAll(std::string& source,const std::string& pattern,const std::string& value)
  2. {
  3.    size_t found = 0;
  4.    while((found=source.find(pattern, found))!=string::npos)
  5.    {
  6.       source.replace(found,pattern.size(),value);
  7.       found += value.size();
  8.    }
  9. }


 
PS : Au passage tu peux rajouter a found la taille de la valeur de remplacement pour éviter un remplacement récursif. (rajouté dans le code ci-dessus)


Message édité par Tarabiscote le 24-06-2010 à 09:35:54
Reply

Marsh Posté le 24-06-2010 à 11:33:31    

En fait, oui, je n'y avais juste pas pensé, merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed