J'ai ce code:

var txt = 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced'; <-- leave this and not replace the last DELIMETER

txt = txt.replace(/DELIMETER/g, "HI");

Je comprends que tous les mots qui ont «DELIMETER» seront remplacés par «HI», mais ce que je veux, c'est simplement remplacer les quatre premières occurrences de «DELIMETER» mais laisser le dernier «DELIMETER» et ne pas remplacer ce mot.

Comment est-ce que je devrais utiliser regex?

1
redoc01 4 juin 2020 à 01:10

3 réponses

Meilleure réponse

Commencez par diviser le texte en deux parties, la partie avant le dernier délimiteur et tout ce qui suit. Effectuez ensuite le remplacement dans la première partie et concaténez-les ensemble.

var txt = 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';

var match = txt.match(/(.*)(DELIMETER.*)/);
if (match) {
  var [whole, part1, part2] = match;
  part1 = part1.replace(/DELIMETER/g, 'OK');
  txt = part1 + part2;
}
console.log(txt);
1
Barmar 3 juin 2020 à 22:24

Vous pouvez utiliser un mélange de regex et de javascript. Un de ces moyens serait de vérifier si c'est la dernière occurrence en utilisant la chaîne lastIndexOf, puis en utilisant une fonction pour parcourir les correspondances lors du remplacement. Si la correspondance est à la fin, renvoyez la chaîne correspondante (DELIMETER) sinon, remplacez-la par le remplacement (HI).

var txt = 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';
txt += 'DELIMETER is replaced';

const target = "DELIMETER";
const replacement = "HI"
const regex = new RegExp(target, 'g');

txt = txt.replace(regex, (match, index) => index === txt.lastIndexOf(target) ? match : replacement);

console.log(txt)
2
Sven Writes Code 3 juin 2020 à 22:21

Coupez simplement le dernier délimiteur à l'avance.

var matches = txt.match(/^(.*)(DELIMETER.*)$/)
txt = matches[1].replace(/DELIMETER/g, "HI") + matches[2]
1
Oleg V. Volkov 3 juin 2020 à 22:25