Como eu poderia substituir uma substring em uma string por outra substring em C ++, quais funções eu poderia usar?
eg: string test = "abc def abc def";
test.replace("abc", "hij").replace("def", "klm"); //replace occurrence of abc and def with other substring
Respostas:
Não existe uma função incorporada em C ++ para fazer isso. Se desejar substituir todas as ocorrências de uma substring por outra, você pode fazer isso misturando chamadas para
string::find
estring::replace
. Por exemplo:Na última linha deste código, aumentei
index
o comprimento da string que foi inserida na string. Neste exemplo específico - substituir"abc"
por"def"
- isso não é realmente necessário. No entanto, em uma configuração mais geral, é importante pular a string que acabou de ser substituída. Por exemplo, se você deseja substituir"abc"
por"abcabc"
, sem pular o segmento de string recém-substituído, esse código substituirá continuamente partes das strings recém-substituídas até que a memória se esgote. Independentemente, pode ser um pouco mais rápido pular esses novos personagens de qualquer maneira, já que isso economiza algum tempo e esforço dastring::find
função.Espero que isto ajude!
fonte
index
) além da parte da string que foi substituída.Forma de biblioteca de algoritmos de string de impulso :
fonte
No c ++ 11, você pode usar
std::regex_replace
:fonte
Eu acho que todas as soluções falharão se o comprimento da corda de substituição for diferente do comprimento da corda a ser substituída. (procure por "abc" e substitua por "xxxxxx") Uma abordagem geral pode ser:
fonte
Onde
str
é a corda basestr2
é a string secundária para encontrarstr3
é a substring de substituiçãofonte
Substituir substrings não deve ser tão difícil.
Se você precisa de desempenho, aqui está uma função otimizada que modifica a string de entrada, mas não cria uma cópia da string:
Testes:
Resultado:
fonte
if (search.empty()) { return; }
para evitar loop infinito ao passar 'pesquisa' vaziaComo não é membro da
string
classe, não permite uma sintaxe tão boa quanto no seu exemplo, mas o seguinte fará o equivalente:fonte
Generalizando a resposta do rotmax, aqui está uma solução completa para pesquisar e substituir todas as instâncias em uma string. Se ambas as substrings forem de tamanhos diferentes, a substring é substituída usando string :: erase e string :: insert., Caso contrário, a string mais rápida :: substituir é usada.
fonte
Se você tiver certeza de que a substring necessária está presente na string, isso substituirá a primeira ocorrência de
"abc"
a"hij"
Ele irá travar se você não tiver "abc" no teste, então use-o com cuidado.
fonte
Aqui está uma solução que escrevi usando a tática do construtor:
Testes:
fonte
Acho que isso se encaixa nas suas necessidades com poucos códigos!
fonte
a versão aprimorada por @Czarek Tomczak.
permitir tanto
std::string
estd::wstring
.fonte
fonte
Aqui está uma solução usando recursão que substitui todas as ocorrências de uma substring por outra substring. Isso funciona independentemente do tamanho das cordas.
Exemplo de uso:
fonte
Solução curta onde você não precisa de nenhuma biblioteca extra.
fonte
fonte