Corriger un mot dans un titre, masquer un numéro, transformer une date au format américain en date française : le remplacement de texte est un geste quotidien, et il réserve une surprise à la première utilisation.
replace ne remplace qu'une seule occurrence, la première. Le comportement est documenté, il n'en reste pas moins la cause d'un bon nombre de corrections qui ne s'appliquent qu'à moitié.
Définition
replace(cherche, remplace) rend une nouvelle String (chaîne de caractères) dans laquelle la première occurrence trouvée a été remplacée. La chaîne d'origine n'est jamais modifiée, il faut donc récupérer le retour.
const phrase = "a-a-a";
console.log(phrase.replace("a", "z")); // "z-a-a"
console.log(phrase.replaceAll("a", "z")); // "z-z-z"
console.log(phrase.replace(/a/g, "z")); // "z-z-z"
console.log(phrase); // "a-a-a", intactTrois écritures, deux résultats. replaceAll est la forme lisible, l'expression régulière avec le drapeau g la forme historique, encore présente dans beaucoup de code.
Les groupes de capture
Avec une RegExp, les portions entre parenthèses sont mémorisées et se réutilisent dans le texte de remplacement sous les noms $1, $2, et ainsi de suite.
const date = "2026-08-20";
console.log(date.replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1")); // "20/08/2026"
console.log("abc".replace("b", "[$&]")); // "a[b]c", $& reprend ce qui a été trouvéLe signe dollar a un sens spécial dans le texte de remplacement. Une valeur venue d'un utilisateur et contenant $& produit donc un résultat inattendu, et $$ insère un dollar unique. Quand le remplacement n'est pas une constante écrite par vous, passez par la forme fonction ci-dessous.
La fonction de remplacement
Le second argument peut être une fonction. Elle reçoit le texte trouvé, puis les groupes capturés, et ce qu'elle rend est inséré tel quel.
console.log("prix 49 et 19".replace(/\d+/g, (m) => Number(m) * 2));
// "prix 98 et 38"
const modeles = { prenom: "Alice", ville: "Lyon" };
console.log("Bonjour {prenom} de {ville}".replace(/{(\w+)}/g, (_, cle) => modeles[cle]));
// "Bonjour Alice de Lyon"Le second exemple tient en une ligne un mini-moteur de gabarit, utile pour des messages courts dont le texte est stocké ailleurs, dans un fichier de traduction par exemple.
Questions fréquentes
replace ou replaceAll ?
replaceAll dès que toutes les occurrences doivent changer, ce qui est le cas le plus fréquent. replace reste utile quand une seule doit l'être, par exemple pour remplacer la première virgule d'une ligne. Notez que replaceAll lève une TypeError si on lui passe une expression régulière sans le drapeau g, ce qui est une protection bienvenue.
Comment remplacer sans tenir compte de la casse ?
Avec une expression régulière portant les drapeaux i et g : texte.replace(/javascript/gi, "JavaScript"). La forme texte de replace et replaceAll compare toujours à l'exact, majuscules comprises, sans option pour l'assouplir.
Comment échapper une valeur avant de l'utiliser comme motif ?
Un texte saisi par un visiteur peut contenir ., * ou (, qui ont un sens dans une expression régulière. Il faut donc les préfixer d'un antislash avant de construire le motif, ou éviter la RegExp et rester sur replaceAll, qui compare du texte brut. Ce genre de détail, et les vraies mécaniques des expressions régulières, sont travaillés dans la formation JavaScript.