150 votes

JavaScript : remplacer la dernière occurrence de texte dans une chaîne

Voir mon extrait de code ci-dessous :

var list = ['one', 'two', 'three', 'four'];
var str = 'one two, one three, one four, one';
for ( var i = 0; i < list.length; i++)
{
     if (str.endsWith(list[i])
     {
         str = str.replace(list[i], 'finish')
     }
 }

Je veux remplacer la dernière occurrence du mot one par le mot finish dans la chaîne, ce que j'ai ne fonctionnera pas car la méthode replace ne remplacera que la première occurrence. Quelqu'un sait-il comment je peux modifier cet extrait de code pour qu'il ne remplace que la dernière instance de « un » ?

166voto

Pointy Points 172438

Eh bien, si la chaîne se termine vraiment avec le motif, vous pouvez faire ceci :

str = str.replace(new RegExp(list[i] + '$'), 'finish');

52voto

T.J. Crowder Points 285826

Vous pouvez utiliser String#lastIndexOf pour trouver la dernière occurrence du mot, puis String#substring et la concaténation pour construire la chaîne de remplacement.

n = str.lastIndexOf(list[i]);
if (n >= 0 && n + list[i].length >= str.length) {
    str = str.substring(0, n) + "finish";
}

...ou le long de ces lignes.

16voto

WilsonCPU Points 71

Pas aussi élégant que les réponses regex ci-dessus, mais plus facile à suivre pour les moins avertis d'entre nous :

function removeLastInstance(badtext, str) {
    var charpos = str.lastIndexOf(badtext);
    if (charpos<0) return str;
    ptone = str.substring(0,charpos);
    pttwo = str.substring(charpos+(badtext.length));
    return (ptone+pttwo);
}

Je me rends compte que c'est probablement plus lent et plus coûteux que les exemples regex, mais je pense que cela pourrait être utile comme illustration de la façon dont les manipulations de cordes peuvent être faites. (Il peut également être condensé un peu, mais encore une fois, je voulais que chaque étape soit claire.)

15voto

nfreeze Points 2203

Voici une méthode qui utilise uniquement le fractionnement et la jonction. C'est un peu plus lisible donc j'ai pensé que ça valait la peine d'être partagé :

    String.prototype.replaceLast = function (what, replacement) {
        var pcs = this.split(what);
        var lastPc = pcs.pop();
        return pcs.join(what) + replacement + lastPc;
    };

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X