替换JavaScript中最后出现的单词

9
我是一个有帮助的助手,可以为您翻译文本。

我在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",但现在我只能替换整个字符串或第一次出现的单词。我该怎么做呢?也许没有好的方法吗?


这个问题已经被回答了:https://dev59.com/lnE85IYBdhLWcg3whUBr#2729681 - Bucket
7个回答

26

这是一个想法....

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

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
如果您想要不区分大小写的版本,那么代码必须进行修改。请告诉我,我可以为您修改它。(附带说明:我正在这样做,很快会发布代码)
更新:这里是一个不区分大小写的字符串搜索版本。
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

注意:以上代码寻找的是字符串,而不是整个单词(即在正则表达式中包含单词边界)。如果该字符串必须是整个单词,则必须进行重新编写。

更新2:这里是带有正则表达式的不区分大小写的整个单词匹配版本。

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

祝你好运 :)


8
// 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(" ");

1
这正是我会做的方式。所有这些正则表达式的答案对于一些简单的东西来说都太复杂了! - Dieterg
只更改最后一个单词,而不是最后的“abc”。 - fiction
现在没问题了,但应该是 words = words.join(" ") - fiction

3
您希望完成以下两个操作:
  • 匹配 abc
  • 检查字符串中之后没有另一个 abc
您可以使用以下代码:
abc(?!.*abc)

(?!...)是负向先行断言,如果括号内的内容匹配成功,整个正则表达式就会失败。

需要注意的是,这将在abcdaire中匹配abc:如果您只想匹配独立的单词abc,则需要添加单词边界\b

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

由于某种原因,string.replace(/\babc\b(?!.*\babc\b)/, '') 会将最后一个 abc 替换为空格,你知道为什么吗?http://jsfiddle.net/5q9K8/11/ - fiction
这真的不应该... 这不仅仅是因为你删除了一个单词,左右两侧的空格现在相邻了吗? - Robin
哈哈,是的,正是因为这个原因,我很蠢。好吧,回答不错。 - fiction

3
您可以使用先行断言来获取句子中的最后一个单词:
var string = "abc def abc xyz";
var repl = string.replace(/\babc\b(?!.*?\babc\b)/, "test");
//=> "abc def test xyz"

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

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

1
我不太熟悉JavaScript,但您可能可以将其扭曲以适应您的需求:
(\b\w+\b)(.*)(\1)\1\2+'your_key_word' 替换。
请参见演示以了解我的意思。

请不要使用代码跨度来表示诸如“JavaScript”之类的内容。 - Qantas 94 Heavy

0

您可以利用replace方法在不使用全局标志的情况下仅替换目标字符串的第一次出现,尝试以下代码:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接