如何替换一个字符串的所有出现的地方

javascript string replace


我有这个字符串。

"Test abc test test abc test test test abc test test abc"

Doing:

str = str.replace('abc', '');

似乎只删除上面字符串中的 abc 第一次出现。

如何替换所有出现的内容?




Answer 1 Matthew Crumley


注意:请勿在对性能有要求的代码中使用此代码。

作为一个简单的文字字符串的正则表达式的替代方法,你可以使用

str = "Test abc test test abc test...".split("abc").join("");

一般模式是

str.split(search).join(replacement)

在某些情况下,它过去比使用 replaceAll 和正则表达式要快,但是在现代浏览器中,情况似乎不再如此。

基准:https : //jsperf.com/replace-all-vs-split-join

结论。如果你有一个性能关键的用例(例如处理数百个字符串),就使用Regexp方法。但对于大多数典型的用例来说,不用担心特殊字符是非常值得的。




Answer 2 Sean Bright


str = str.replace(/abc/g, '');

针对评论:

var find = 'abc';
var re = new RegExp(find, 'g');

str = str.replace(re, '');

为了回应Click Upvote的评论,您可以进一步简化它:

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(find, 'g'), replace);
}

注意:正则表达式包含特殊的(元)字符,因此危险的是在上面的 find 函数中盲目传递参数,而无需对其进行预处理以转义那些字符。Mozilla开发人员网络JavaScript正则表达式指南中对此进行了介绍,该指南提供了以下实用程序功能(自最初编写此答案以来,该功能至少已更改两次,因此请确保检查MDN站点是否有潜在更新):

function escapeRegExp(string) {
  return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

因此,为了使上面的 replaceAll() 函数更安全,如果还包含 escapeRegExp ,可以将其修改为以下内容:

function replaceAll(str, find, replace) {
  return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}



Answer 3 Cory Gross


为了完整,我开始思考应该用哪种方法来做这件事。基本上有两种方法,按照本页其他答案的建议。

注意:通常,通常不建议在JavaScript中扩展内置原型。我仅作为说明目的在String原型上提供扩展,显示在 String 内置原型上假设的标准方法的不同实现。


基于正则表达式的实现

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

分割和加入(功能)的实现

String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};

由于不太了解正则表达式背后的效率如何,我过去倾向于拆分和加入的实现,而没有考虑性能问题。当我确实想知道哪种方法更有效率,以及效率如何时,我就以此为借口去寻找答案。

在我的Chrome Windows 8计算机上,基于正则表达式的实现最快,而split and join实现的速度慢了53%。意味着正则表达式的速度是我使用的lorem ipsum输入的两倍。

检验此基准测试,相互对照运行这两个实现。


如@ThomasLeduc和其他人在下面的注释中所指出的,如果 search 包含某些保留为正则表达式中特殊字符的字符,则基于正则表达式的实现可能会出现问题。该实现假定调用方将预先转义字符串,或仅传递不包含正则表达式(MDN)表中字符的字符串。

MDN还提供了一种实现来转义我们的字符串。如果也将它也标准化为 RegExp.escape(str) 会很好,但是,它不存在:

function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

我们可以在 String.prototype.replaceAll 实现中调用 escapeRegExp ,但是,我不确定这会对性能有多大的影响(甚至对于不需要转义的字符串(例如所有字母数字字符串)也可能会影响性能。




Answer 4 Adam A


使用设置了 g 标志的正则表达式将替换所有:

someString = 'the cat looks like a cat';
anotherString = someString.replace(/cat/g, 'dog');
// anotherString now contains "the dog looks like a dog"

也请看这里




Answer 5 jesal


这里有一个基于接受答案的字符串原型函数。

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find, 'g'), replace);
};

EDIT

如果 find 包含特殊字符,则需要转义它们:

String.prototype.replaceAll = function (find, replace) {
    var str = this;
    return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'), 'g'), replace);
};

小提琴:http://jsfiddle.net/cdbzL/