JavaScript:replacestring中最后一次出现的文本

看到我的代码片段如下:

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

我想用string中的单词finish来replace单词one的最后一个出现,我所拥有的将不起作用,因为replace方法将只replace它的第一个出现。 有谁知道我可以如何修改该代码段,以便它只replace“one”的最后一个实例

那么,如果string真的以模式结束,你可以这样做:

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

您可以使用String#lastIndexOf来查找单词的最后一次出现,然后使用String#substring和concatenation来构buildreplacestring。

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

…或沿着这些线路。

我知道这很愚蠢,但今天早上我感觉很有创意:

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

不像上面的正则expression式那么优雅,但更容易遵循我们之间的不精通:

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

我意识到这可能比正则expression式更慢,更浪费,但我认为这可能有助于说明如何进行string操作。 (也可以简化一下,但是我希望每一步都清楚。)

以为我会在这里回答,因为这是我的谷歌search第一次出现,没有答案(马特的创造性的答案之外:)),一般replacestring的最后一次出现,当replace文本可能不会在最后的string。

 if (!String.prototype.replaceLast) { String.prototype.replaceLast = function(find, replace) { var index = this.lastIndexOf(find); if (index >= 0) { return this.substring(0, index) + replace + this.substring(index + find.length); } return this.toString(); }; } var str = 'one two, one three, one four, one'; // outputs: one two, one three, one four, finish console.log(str.replaceLast('one', 'finish')); // outputs: one two, one three, one four; one console.log(str.replaceLast(',', ';')); 

难道你不能扭转string,只取代第一次出现的反向search模式? 我在想 。 。 。

 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]) { var reversedHaystack = str.split('').reverse().join(''); var reversedNeedle = list[i].split('').reverse().join(''); reversedHaystack = reversedHaystack.replace(reversedNeedle, 'hsinif'); str = reversedHaystack.split('').reverse().join(''); } } 

这是一个只使用分割和连接的方法。 它更可读,所以认为它值得分享:

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

旧的和大的代码,但尽可能高效:

 function replaceLast(origin,text){ textLenght = text.length; originLen = origin.length if(textLenght == 0) return origin; start = originLen-textLenght; if(start < 0){ return origin; } if(start == 0){ return ""; } for(i = start; i >= 0; i--){ k = 0; while(origin[i+k] == text[k]){ k++ if(k == textLenght) break; } if(k == textLenght) break; } //not founded if(k != textLenght) return origin; //founded and i starts on correct and i+k is the first char after end = origin.substring(i+k,originLen); if(i == 0) return end; else{ start = origin.substring(0,i) return (start + end); } } 

如果速度很重要,使用这个:

 /** * Replace last occurrence of a string with another string * x - the initial string * y - string to replace * z - string that will replace */ function replaceLast(x, y, z){ var a = x.split(""); var length = y.length; if(x.lastIndexOf(y) != -1) { for(var i = x.lastIndexOf(y); i < x.lastIndexOf(y) + length; i++) { if(i == x.lastIndexOf(y)) { a[i] = z; } else { delete a[i]; } } } return a.join(""); } 

这比使用RegExp更快。

 str = (str + '?').replace(list[i] + '?', 'finish');