Reemplazar subcadena con otra subcadena C++

7 minutos de lectura

Reemplazar subcadena con otra subcadena C
steven

¿Cómo podría reemplazar una subcadena en una cadena con otra subcadena en C++, qué funciones podría usar?

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

  • Más o menos un duplicado de stackoverflow.com/questions/3418231/… que tiene una solución más sólida en la respuesta aceptada.

    – dave-holm

    21 de junio de 2011 a las 4:44

1646975831 701 Reemplazar subcadena con otra subcadena C
Jinguo Yao

En c ++ 11, puede usar 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"

  • ¡Eso sería genial si tuviéramos c ++ 11!

    – Michele

    27 de marzo de 2017 a las 17:34

  • cuidado con esto no generalices bien, puede que acabes pasando algo std:regex interpretar de manera diferente como std::regex_replace(test, std::regex("."), "klm")

    – Tomás Vicente

    2 feb a las 20:56

1646975832 991 Reemplazar subcadena con otra subcadena C
templatetypedef

No hay una función integrada en C++ para hacer esto. Si desea reemplazar todas las instancias de una subcadena con otra, puede hacerlo mezclando llamadas a string::find y string::replace. Por ejemplo:

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

En la última línea de este código, he incrementado index por la longitud de la cadena que se ha insertado en la cadena. En este ejemplo particular – reemplazando "abc" con "def" – esto no es realmente necesario. Sin embargo, en una configuración más general, es importante pasar por alto la cadena que acaba de ser reemplazada. Por ejemplo, si desea reemplazar "abc" con "abcabc", sin omitir el segmento de cadena recién reemplazado, este código reemplazaría continuamente partes de las cadenas recién reemplazadas hasta que se agotara la memoria. Independientemente, podría ser un poco más rápido saltear esos nuevos caracteres de todos modos, ya que al hacerlo se ahorra algo de tiempo y esfuerzo por parte del string::find función.

¡Espero que esto ayude!

  • No creo que necesite incrementar el índice porque ya reemplazó los datos, por lo que no los recogería de todos modos.

    – rossb83

    4 de noviembre de 2012 a las 17:25

  • @Aidiakapi Si esto se convierte en una función de propósito general, no se atascará en un bucle infinito porque avanza la posición de búsqueda (index) más allá de la parte de la cadena que se reemplazó.

    – Tim R.

    14/08/2015 a las 22:50

  • @TimR. Tienes razón, estaba respondiendo a rossb83 quien afirma que el incremento del índice es innecesario. Solo estaba tratando de evitar la desinformación. Así que para todos los demás: Aumentar el índice por la longitud de la cadena reemplazada (en este caso 3) es necesario. No lo elimine del ejemplo de código.

    – Aidiakapi

    14/08/2015 a las 23:56

  • @ rossb83 Los comentarios deben limpiarse o exponerse. Hay un comentario con 5 votos a favor que dice que no tiene que incrementar el índice y luego una persona que dice que necesita hacerlo en negrita. Esto no es útil para alguien que viene aquí para aprender.

    usuario2918461

    21 de marzo de 2017 a las 18:38

  • @JulianCienfuegos Acabo de actualizar la respuesta para abordar esto. ¡Gracias por señalarlo! (Además, Aidiakapi es otra persona… no estoy seguro de quién es).

    – templatetypedef

    21 de marzo de 2017 a las 18:52

Biblioteca de algoritmos Boost String manera:

#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"
  );
}

  • Arrendajo. Necesito impulso para reemplazar todas las subcadenas.

    – Johannes Overman

    11 de enero de 2019 a las 10:12

  • Boost es principalmente una exageración.

    – Konrad

    6 de marzo de 2019 a las 23:18

Creo que todas las soluciones fallarán si la longitud de la cadena de reemplazo es diferente de la longitud de la cadena que se reemplazará. (busque “abc” y reemplácelo por “xxxxxx”) Un enfoque general podría ser:

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

Reemplazar subcadena con otra subcadena C
jeff zacher

str.replace(str.find(str2),str2.length(),str3);

Donde

  • str es la cadena base
  • str2 es la subcadena a encontrar
  • str3 es la subcadena de reemplazo

  • Esto solo reemplaza la primera aparición, ¿no es así?

    – jpo38

    10 de agosto de 2017 a las 9:01

  • Sugeriría asegurarse de que el resultado de str.find(str2) no sea igual a std::string::npos auto found = str.find(str2); if(encontrado!= std::string::npos) str.replace(encontrado, str2.length(), str3);

    – Geoff Lentsch

    30 de noviembre de 2017 a las 20:09


  • No tenía la intención de escribir toda la aplicación con esto, pero sin ninguna verificación en la entrada, hay casos de esto que no están definidos…

    –Jeff Zacher

    29 de marzo de 2019 a las 9:10

1646975834 972 Reemplazar subcadena con otra subcadena C
Zarek Tomczak

Reemplazar subcadenas no debería ser tan difícil.

std::string ReplaceString(std::string subject, const std::string& search,
                          const std::string& replace) {
    size_t pos = 0;
    while((pos = subject.find(search, pos)) != std::string::npos) {
         subject.replace(pos, search.length(), replace);
         pos += replace.length();
    }
    return subject;
}

Si necesita rendimiento, aquí hay una función optimizada que modifica la cadena de entrada, no crea una copia de la cadena:

void ReplaceStringInPlace(std::string& subject, const std::string& search,
                          const std::string& replace) {
    size_t pos = 0;
    while((pos = subject.find(search, pos)) != std::string::npos) {
         subject.replace(pos, search.length(), replace);
         pos += replace.length();
    }
}

Pruebas:

std::string input = "abc abc def";
std::cout << "Input string: " << input << std::endl;

std::cout << "ReplaceString() return value: " 
          << ReplaceString(input, "bc", "!!") << std::endl;
std::cout << "ReplaceString() input string not changed: " 
          << input << std::endl;

ReplaceStringInPlace(input, "bc", "??");
std::cout << "ReplaceStringInPlace() input string modified: " 
          << input << std::endl;

Producción:

Input string: abc abc def
ReplaceString() return value: a!! a!! def
ReplaceString() input string not modified: abc abc def
ReplaceStringInPlace() input string modified: a?? a?? def

  • Esto solo reemplaza la primera aparición, ¿no es así?

    – jpo38

    10 de agosto de 2017 a las 9:01

  • Sugeriría asegurarse de que el resultado de str.find(str2) no sea igual a std::string::npos auto found = str.find(str2); if(encontrado!= std::string::npos) str.replace(encontrado, str2.length(), str3);

    – Geoff Lentsch

    30 de noviembre de 2017 a las 20:09


  • No tenía la intención de escribir toda la aplicación con esto, pero sin ninguna verificación en la entrada, hay casos de esto que no están definidos…

    –Jeff Zacher

    29 de marzo de 2019 a las 9:10

1646975835 691 Reemplazar subcadena con otra subcadena C
miguel rebabas

using std::string;

string string_replace( string src, string const& target, string const& repl)
{
    // handle error situations/trivial cases

    if (target.length() == 0) {
        // searching for a match to the empty string will result in 
        //  an infinite loop
        //  it might make sense to throw an exception for this case
        return src;
    }

    if (src.length() == 0) {
        return src;  // nothing to match against
    }

    size_t idx = 0;

    for (;;) {
        idx = src.find( target, idx);
        if (idx == string::npos)  break;

        src.replace( idx, target.length(), repl);
        idx += repl.length();
    }

    return src;
}

Como no es miembro de la string clase, no permite una sintaxis tan agradable como en su ejemplo, pero lo siguiente hará el equivalente:

test = string_replace( string_replace( test, "abc", "hij"), "def", "klm")

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad