Avec les chaînes littérales, c'est assez facile.
Pas vraiment ! L'exemple ne fait que remplacer le premièrement l'apparition de string_to_replace
. Plus couramment, vous souhaitez remplacer toutes les occurrences, auquel cas vous devez convertir la chaîne en une chaîne globale ( /.../g
) Vous pouvez le faire à partir d'une chaîne de caractères en utilisant la fonction new RegExp
constructeur :
new RegExp(string_to_replace, 'g')
Le problème est que tous les caractères spéciaux de regex dans le littéral de la chaîne se comporteront de manière spéciale au lieu d'être des caractères normaux. Il faudrait les "backslash-escape" pour corriger cela. Malheureusement, il n'y a pas de fonction intégrée pour faire cela pour vous, alors en voici une que vous pouvez utiliser :
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
Notez également que lorsque vous utilisez un RegExp dans replace()
la chaîne de remplacement a maintenant un caractère spécial aussi, $
. Il faut également l'échapper si l'on veut avoir un littéral $
dans votre texte de remplacement !
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Quatre $
parce que c'est lui-même une chaîne de remplacement - aïe !)
Vous pouvez maintenant mettre en œuvre le remplacement global de chaînes de caractères avec RegExp :
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
Quelle douleur. Heureusement, si tout ce que vous voulez faire est un simple remplacement de chaîne de caractères sans aucune partie supplémentaire de regex, il existe un moyen plus rapide :
s.split(string_to_replace).join(replacement)
...et c'est tout. Il s'agit d'une expression idiomatique courante.
disons que je veux remplacer tout sauf la chaîne_à_remplacer
Cela signifie que vous voulez remplacer toutes les parties de texte qui ne participent pas à une correspondance avec la chaîne de caractères ? Un remplacement avec ^
ne le fait certainement pas, parce que ^
signifie un jeton de début de chaîne, pas une négation. ^
est seulement une négation dans []
groupes de caractères. Il existe également des anticipations négatives (?!...)
mais cela pose des problèmes en JScript et vous devez donc généralement l'éviter.
Vous pouvez essayer de faire correspondre "tout ce qui va jusqu'à" la chaîne de caractères, et utiliser une fonction pour éliminer toute partie vide entre les chaînes de caractères correspondantes :
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Là encore, une scission pourrait être plus simple :
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);