«Substituir tudo» em JavaScript: de gambiarras antigas ao padrão moderno
Imagine a situação: você está escrevendo um chatbot, e o usuário enviou uma mensagem com um erro de digitação «oláá». Precisa substituir todas as ocorrências de «á» por «a». Ou você está analisando um arquivo CSV e quer remover todos os espaços extras. Parece simples? Em JavaScript, até recentemente, isso era uma verdadeira dor de cabeça.
A pergunta «How do I replace all occurrences of a string?» é uma das mais populares no Stack Overflow. Milhares de desenvolvedores tropeçavam nessa tarefa aparentemente elementar. Por quê? Porque o bom e velho replace() por padrão substitui apenas a primeira correspondência. O truque? Usar uma expressão regular com a flag g. Mas em 2025, temos uma solução muito mais elegante.
Neste artigo, vamos analisar todas as formas atuais de substituir todas as ocorrências de uma substring em JavaScript: desde os clássicos até os padrões modernos. Você descobrirá qual método escolher para diferentes tarefas e por que replaceAll é seu novo melhor amigo.
Por que o antigo replace() não funciona «de fábrica»?
Vamos começar pela decepção que todo iniciante já enfrentou:
let text = "Eu amo JavaScript, JavaScript é demais!";let newText = text.replace("JavaScript", "Python");console.log(newText); // Saída: "Eu amo Python, JavaScript é demais!"Viu? Substituiu apenas a primeira ocorrência. O método String.prototype.replace() foi projetado assim historicamente. Se você passar uma string (e não uma expressão regular), ele procura e substitui a primeira correspondência. Para muitas linguagens (Python, Java), isso foi um choque. Mas JavaScript conviveu com essa limitação por muito tempo.
A propósito, se você está procurando a resposta para a pergunta «how do I replace all occurrences of a string in JavaScript», saiba que até 2021 a única maneira confiável era usar RegExp.
Método nº1: Clássico — replace() + RegExp (ainda relevante)
Este é o método «do vovô», que funciona em todos os navegadores, incluindo Internet Explorer (sim, ele ainda existe em algum lugar). O segredo é a flag g (global).
let text = "O gato comeu o rato. O gato está feliz.";let newText = text.replace(/gato/g, "cachorro");console.log(newText); // "O cachorro comeu o rato. O cachorro está feliz."Vantagens:
- Funciona em todos os lugares (IE11, versões antigas do Node.js)
- Poderoso: permite usar grupos de captura, flags
i(case-insensitive) - Muito rápido
Desvantagens:
- Requer escapar caracteres especiais (ponto, asterisco, etc.)
- Código menos legível para iniciantes
- Não é adequado se a string de substituição for dinâmica (vinda do usuário)
Se você precisa substituir uma string dinâmica, use o construtor RegExp:
function escapeRegExp(string) { return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');}
let userInput = "olá.mundo";let text = "olá.mundo, como vai? olá.mundo!";let safePattern = escapeRegExp(userInput);let result = text.replace(new RegExp(safePattern, 'g'), 'tchau.tudo');console.log(result);// "tchau.tudo, como vai? tchau.tudo!"A função escapeRegExp é um ritual obrigatório se você trabalha com entrada do usuário. Caso contrário, o ponto na string será interpretado como «qualquer caractere».
Método nº2: Padrão moderno — replaceAll() (ES2021+)
A partir do ES2021 (ECMAScript 2021), temos o String.prototype.replaceAll(). Esta é a resposta para a pergunta «how do I replace all occurrences of a string in JavaScript», que era esperada há anos.
let text = "Eu amo JavaScript, JavaScript é demais!";let newText = text.replaceAll("JavaScript", "Python");console.log(newText); \