如何在JavaScript中替换所有出现的字符串?

我有这个字符串:

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

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

似乎只能删除上面字符串中第一次出现的abc 。 我怎样才能取代它的所有事件?


为了完整起见,我不得不考虑使用哪种方法来完成此操作。 根据本页其他答案的建议,基本上有两种方法可以做到这一点。

注意:通常,不推荐使用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机器上, 基于正则表达式的实现速度最快拆分和连接实现速度降低了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 ,但是,我不确定这会对性能产生多大影响(甚至对于不需要转义的字符串,如所有字母数字字符串)。


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

注:正则表达式包含特殊(meta)字符,因此在上面的find函数中盲目传递参数而不预处理它以转义这些字符是危险的。 Mozilla开发人员网络的JavaScript正则表达式指南中介绍了这些内容,它们提供了以下实用程序功能:

function escapeRegExp(str) {
    return str.replace(/([.*+?^=!:${}()|[]/])/g, "$1");
}

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

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

注意:不要在实际代码中使用它。

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

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

一般模式是

str.split(search).join(replacement)

在某些情况下,这比使用replaceAll和正则表达式更快,但在现代浏览器中似乎不再是这种情况。 所以,这实际上只能作为一种快速入侵来避免需要转义正则表达式,而不是真正的代码。

链接地址: http://www.djcxy.com/p/333.html

上一篇: How to replace all occurrences of a string in JavaScript?

下一篇: How can I prevent SQL injection in PHP?