在javascript中替换最后出现的单词

时间:2014-04-17 15:01:53

标签: javascript regex replace

我在替换JS中的最后一个单词时遇到问题,我仍在搜索解决方案,但我无法得到它。

我有这段代码:

var string = $(element).html(); // "abc def abc xyz"
var word   = "abc";
var newWord = "test";

var newV   = string.replace(new RegExp(word,'m'), newWord);

我想在此字符串中替换最后一个单词“abc”,但现在我只能替换字符串中的所有或第一个匹配项。我怎样才能做到这一点?也许不是好方法?

7 个答案:

答案 0 :(得分:15)

这是一个想法......

这是一个区分大小写的字符串搜索版本

var str = 'abc def abc xyz';
var word = 'abc';
var newWord = 'test';

// find the index of last time word was used
// please note lastIndexOf() is case sensitive
var n = str.lastIndexOf(word);

// slice the string in 2, one from the start to the lastIndexOf
// and then replace the word in the rest
str = str.slice(0, n) + str.slice(n).replace(word, newWord);
// result abc def test xyz

如果您需要不区分大小写的版本,则必须更改代码。让我知道,我可以为你改变它。 (PS。我这样做,所以我会很快发布)

更新:以下是不区分大小写的字符串搜索版

var str = 'abc def AbC xyz';
var word = 'abc';
var newWord = 'test';

// find the index of last time word was used
var n = str.toLowerCase().lastIndexOf(word.toLowerCase());

// slice the string in 2, one from the start to the lastIndexOf
// and then replace the word in the rest
var pat = new RegExp(word, 'i')
str = str.slice(0, n) + str.slice(n).replace(pat, newWord);
// result abc def test xyz

N.B。以上代码查找字符串。不是整个单词(即RegEx中的单词边界)。如果字符串必须是一个完整的单词,那么必须重新编写。

更新2:以下是一个不区分大小写的全字匹配版本,带有RegEx

var str = 'abc def AbC abcde xyz';
var word = 'abc';
var newWord = 'test';

var pat = new RegExp('(\\b' + word + '\\b)(?!.*\\b\\1\\b)', 'i');
str = str.replace(pat, newWord);
// result abc def test abcde xyz
祝你好运 :)

答案 1 :(得分:5)

// create array
var words = $(element).html().split(" ");

// find last word and replace it
words[words.lastIndexOf("abc")] = newWord 

// put it back together
words = words.join(" ");

答案 2 :(得分:3)

您可以使用前瞻来获取句子中的最后一个单词:

var string = "abc def abc xyz";
var repl = string.replace(/\babc\b(?!.*?\babc\b)/, "test");
//=> "abc def test xyz"

答案 3 :(得分:3)

你想要两个:

  • 匹配abc
  • 检查字符串
  • 中是否有其他abc

所以你可以使用:

abc(?!.*abc)

(?!...)是一个负向前瞻,如果前瞻中的内容匹配,它将失败整个正则表达式匹配。

另外要小心,因为它与abc中的abcdaire匹配:如果您只想要abc作为单独的单词,则需要添加单词边界\b

\babc\b(?!.*\babc\b)

答案 4 :(得分:1)

我对JavaScript不太熟悉,但您可以根据自己的需要进行扭曲:

(\b\w+\b)(.*)(\1)替换为\1\2+'your_key_word'

See the demo看看我的意思。

答案 5 :(得分:1)

尝试

var string = $(element).html(); // "abc def abc xyz"
var word   = "abc";
var newWord = "test";

var newV   = string.replace(new RegExp(word+'$'), newWord);

答案 6 :(得分:0)

如果在没有全局标志的情况下使用,replace方法仅替换目标字符串的第一个匹配项,您可以尝试使用以下这样的事实:

"abc def abc xyz abc jkl".split(' ').reverse().join(' ').replace('abc', 'test').split(' ').reverse().join(' ')