JavaScript: замените последнее вхождение текста в строке

Посмотрите мой фрагмент кода ниже:

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')
     }
 }

Я хочу заменить последнее вхождение слова один с концом слова в строке, что я имею, не будет работать, потому что метод замены только заменит первое вхождение его. Делает любой знает, как я могу исправить тот отрывок так, чтобы он только заменил последний экземпляр 'одного'

80
задан Cœur 25 April 2017 в 17:04
поделиться

3 ответа

Что ж, если строка действительно заканчивается шаблоном, вы можете сделать это:

str = str.replace(new RegExp(list[i] + '$'), 'finish');
95
ответ дан 24 November 2019 в 09:51
поделиться

Вы можете использовать String # lastIndexOf , чтобы найти последнее вхождение слова, а затем String # substring и конкатенацию, чтобы построить заменяющую строку.

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

... или в этом роде.

34
ответ дан 24 November 2019 в 09:51
поделиться

Я знаю, что это глупо, но сегодня утром я чувствую себя творчески:

'one two, one three, one four, one'
.split(' ') // array: ["one", "two,", "one", "three,", "one", "four,", "one"]
.reverse() // array: ["one", "four,", "one", "three,", "one", "two,", "one"]
.join(' ') // string: "one four, one three, one two, one"
.replace(/one/, 'finish') // string: "finish four, one three, one two, one"
.split(' ') // array: ["finish", "four,", "one", "three,", "one", "two,", "one"]
.reverse() // array: ["one", "two,", "one", "three,", "one", "four,", "finish"]
.join(' '); // final string: "one two, one three, one four, finish"

Так что на самом деле , все, что вам нужно сделать, это добавить эту функцию к прототипу String:

String.prototype.replaceLast = function (what, replacement) {
    return this.split(' ').reverse().join(' ').replace(new RegExp(what), replacement).split(' ').reverse().join(' ');
};

Затем запустить ее так: str = str.replaceLast ('one', 'finish');

Вы должны знать одно ограничение: поскольку функция разбивается по пробелу, вы , вероятно, не можете найти / заменить что-либо с пробелом.

На самом деле, теперь, когда я думаю об этом, вы можете обойти проблему «пробела», разделив пустой токен.

String.prototype.reverse = function () {
    return this.split('').reverse().join('');
};

String.prototype.replaceLast = function (what, replacement) {
    return this.reverse().replace(new RegExp(what.reverse()), replacement.reverse()).reverse();
};

str = str.replaceLast('one', 'finish');
20
ответ дан 24 November 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: