Avec les chaînes littérales, c'est assez simple.
Pas vraiment! L'exemple ne remplace que la première occurrence de string_to_replace
. Le plus souvent, vous souhaitez remplacer toutes les occurrences, auquel cas vous devez convertir la chaîne en un /.../g
RegExp global ( ). Vous pouvez le faire à partir d'une chaîne en utilisant le new RegExp
constructeur:
new RegExp(string_to_replace, 'g')
Le problème avec ceci est que tous les caractères spéciaux de regex dans la chaîne littérale se comporteront de leur manière spéciale au lieu d'être des caractères normaux. Vous devrez leur échapper une barre oblique inverse pour résoudre ce problème. 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 une expression rationnelle replace()
, la chaîne de remplacement a maintenant un caractère spécial aussi $
. Cela doit également être échappé si vous voulez avoir un littéral $
dans votre texte de remplacement!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(Quatre $
s parce que c'est en soi une chaîne de remplacement - argh!)
Vous pouvez maintenant implémenter le remplacement de chaîne global 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 remplacement de chaîne droite sans parties supplémentaires de regex, il existe un moyen plus rapide:
s.split(string_to_replace).join(replacement)
...et c'est tout. C'est un idiome communément compris.
dis que je veux tout remplacer sauf string_to_replace
Qu'est-ce que cela signifie, vous souhaitez remplacer toutes les parties de texte ne participant pas à une correspondance par rapport à la chaîne? Un remplacement par ^
n'est certainement pas cela, car cela ^
signifie un jeton de début de chaîne, pas une négation. ^
n'est qu'une négation dans les []
groupes de caractères. Il y a aussi des anticipations de recherche négatives (?!...)
, mais il y a des problèmes avec cela dans JScript donc vous devriez généralement l'éviter.
Vous pouvez essayer de faire correspondre `` tout jusqu'à '' la chaîne et d'utiliser une fonction pour supprimer tout étirement vide entre les chaînes correspondantes:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
Ici 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);
/
délimiteurs de regex lorsque vous utilisez également ce formulaire.