首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何替换JavaScript中出现的所有字符串?

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

Stack Overflow用户
提问于 2009-07-17 17:53:46
回答 75查看 4.3M关注 0票数 5.3K

给出一个字符串:

代码语言:javascript
运行
复制
s = "Test abc test test abc test test test abc test test abc";

这似乎只删除了上面字符串中第一个出现的abc

代码语言:javascript
运行
复制
s = s.replace('abc', '');

我如何替换它的所有事件?

EN

回答 75

Stack Overflow用户

回答已采纳

发布于 2009-07-17 20:29:12

在大多数流行浏览器的最新版本中,您可以使用replaceAll,如下所示:

代码语言:javascript
运行
复制
let result = "1 abc 2 abc 3".replaceAll("abc", "xyz");
// `result` is "1 xyz 2 xyz 3"

但是,首先检查我能用一下吗或其他兼容性表,以确保您针对的浏览器首先添加了对它的支持。

对于Node.js和与旧的/非当前浏览器的兼容性:

注意:在性能关键代码中不要使用以下解决方案.

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

代码语言:javascript
运行
复制
str = "Test abc test test abc test...".split("abc").join("");

一般的模式是

代码语言:javascript
运行
复制
str.split(search).join(replacement)

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

基准:https://jsben.ch/TZYzj

结论:

如果您有一个性能关键的用例(例如,处理数百个字符串),请使用正则表达式方法。但是对于大多数典型的用例来说,这是非常值得的,不必担心特殊的角色。

票数 2.3K
EN

Stack Overflow用户

发布于 2009-07-17 17:54:49

截至2020年8月的:由ECMAScript 2021语言规范定义的方法 现代浏览器支持

用于旧版/旧版浏览器的

代码语言:javascript
运行
复制
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

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

以下是这个答案的演变过程:

代码语言:javascript
运行
复制
str = str.replace(/abc/g, '');

在回答评论时,“如果'abc‘作为一个变量传递,怎么办?”:

代码语言:javascript
运行
复制
var find = 'abc';
var re = new RegExp(find, 'g');

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

在回应单击“向上”的评论时,你可以把它简化得更简单:

代码语言:javascript
运行
复制
function replaceAll(str, find, replace) {
  return str.replace(new RegExp(find, 'g'), replace);
}

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

代码语言:javascript
运行
复制
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}

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

代码语言:javascript
运行
复制
function replaceAll(str, find, replace) {
  return str.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
票数 5.1K
EN

Stack Overflow用户

发布于 2013-07-12 01:46:24

为了完整起见,我不得不考虑应该使用哪种方法来完成这项工作。基本上有两种方法可以做到这一点,如本页的其他答案所建议的那样。

注意:一般情况下,不建议在JavaScript中扩展内置的原型。我只是为了说明而在字符串原型上提供扩展,在String内置原型上展示一个假设的标准方法的不同实现。

基于正则表达式的实现

代码语言:javascript
运行
复制
String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.replace(new RegExp(search, 'g'), replacement);
};

拆分和连接(功能)实现

代码语言:javascript
运行
复制
String.prototype.replaceAll = function(search, replacement) {
    var target = this;
    return target.split(search).join(replacement);
};

由于不太了解正则表达式在幕后的工作效率,我倾向于过去的拆分和加入实现,而不考虑性能。当我想知道哪一个更有效率,有多大的差距时,我就用它作为找出答案的借口。

在我的Chrome 8机器上,基于正则表达式的实现是最快的拆分和连接实现的慢53%。这意味着对于我使用的lorem输入,正则表达式的速度是以前的两倍。

查看这个运行这两个实现的基准测试

正如@ThomasLeduc和其他人在下面的评论中所指出的,如果search包含某些保留为正则表达式中的特殊字符的字符,则基于正则表达式的实现可能会出现问题。该实现假定调用方将提前转义字符串,或者只传递https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#Using_special_characters (MDN)中表中没有字符的字符串。

MDN还提供了一个转义字符串的实现。如果这也被标准化为RegExp.escape(str),那就太好了,但是遗憾的是,它并不存在:

代码语言:javascript
运行
复制
function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}

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

票数 2.5K
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1144783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档