La fonction replace
renvoie la nouvelle chaîne avec les remplacements, mais s'il n'y avait pas de mots à remplacer, alors la chaîne d'origine est renvoyée. Y a-t-il un moyen de savoir s'il a réellement remplacé autre chose que la comparaison du résultat avec la chaîne d'origine ?
Réponses
Trop de publicités?Une option simple est de vérifier les correspondances avant de remplacer :
var regex = /i/g;
var newStr = str;
var replaced = str.search(regex) >= 0;
if(replaced){
newStr = newStr.replace(regex, '!');
}
Si vous ne le souhaitez pas non plus, vous pouvez abuser du rappel replace
pour y parvenir en un seul passage :
var replaced = false;
var newStr = str.replace(/i/g, function(token){replaced = true; return '!';});
Si votre remplaçant a une longueur différente du texte recherché, vous pouvez vérifier la longueur de la chaîne avant et après. Je sais, c'est une réponse partielle, valable seulement sur un sous-ensemble du problème.
OU
Vous pouvez faire une recherche. Si la recherche est réussie, vous faites un remplacement sur la sous-chaîne en commençant par l'index trouvé, puis recomposez la chaîne. Cela pourrait être plus lent parce que vous générez 3 chaînes au lieu de 2.
var test = "Hellllo";
var index = test.search(/ll/);
if (index >= 0) {
test = test.substr(0, index - 1) + test.substr(index).replace(/ll/g, "tt");
}
alert(test);