问题描述:

我的 JavaScript 代码中有这个字符串:

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

正在做:

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

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

我怎样才能替换它的所有出现?

解决方案1:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

截至 2020 年 8 月:Modern browsers have support 用于 ECMAScript 2021 语言规范定义的 String.replaceAll() method。

对于旧版/旧版浏览器:

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

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

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

回应评论“如果’abc’作为变量传递怎么办?”:

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 Developer Network 的 JavaScript Guide on Regular Expressions 对此进行了介绍,其中提供了以下实用功能(自最初编写此答案以来,该功能至少更改了两次,因此请务必检查 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);
}

在 escapeRegExp 中,] 和 } 是额外的(不必转义)。最好是:.replace(/[.^$*+?()[{|\\]/g, "\\$&")

您还需要转义替换字符串(考虑 escapeRegExp 如何在替换字符串中使用 $& 来实现特殊行为)。将最后一个代码块中的最后一个 replace 更改为 replace.replace(/\$/g, '$$$$')。请参阅 stackoverflow.com/a/6969486/2730641 测试用例:replaceAll('abc def abc', 'abc', '$&@%#!') // Censor 'abc'

解决方案2:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

为了完整起见,我开始考虑应该使用哪种方法来做到这一点。正如本页其他答案所建议的,基本上有两种方法可以做到这一点。

注意: 一般来说,不推荐在 JavaScript 中扩展内置原型。我只是为了说明的目的而提供字符串原型的扩展,在 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);
};

由于不太了解正则表达式在效率方面的幕后工作原理,我过去倾向于倾向于 split 和 join 实现,而不考虑性能。当我确实想知道哪个更有效率,以及有多少余量时,我用它作为找出答案的借口。

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

查看此 benchmark 对彼此运行这两个实现。

正如@ThomasLeduc 和其他人在下面的评论中所指出的,如果 search 包含某些保留为 special characters in regular expressions 的字符,则基于正则表达式的实现可能会出现问题。该实现假定调用者将预先转义字符串或仅传递 Regular Expressions (MDN) 中的表中没有字符的字符串。

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

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

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

2021 年 String.prototype.replaceAll() 原生存在。所以这个实现应该在使用前先检查一下。

m使用nestjs,所以打字稿显示replaceAll不是String原型的方法的错误,有什么解决方案吗?

解决方案3:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

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

let result = "1 abc 2 abc 3".replaceAll("abc", "xyz");
// `result` is "1 xyz 2 xyz 3"

但请先检查 Can I use 或其他兼容性表,以确保您定位的浏览器首先添加了对它的支持。

对于 Node 以及与旧版/非当前浏览器的兼容性:

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

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

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

一般模式是

str.split(search).join(replacement)

在某些情况下,这曾经比使用 replaceAll 和正则表达式更快,但在现代浏览器中似乎不再如此。

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

结论:

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

我不鼓励此时(2020 年)使用 replaceAll。今年有更新的一些浏览器不支持caniuse.com/?search=replaceAll太早了

NodeJS 在 15.x 版本中支持 replaceAll。

在区分大小写的情况下该怎么做

基准的普通替换功能不等同于正则表达式 /g。 "如果pattern是一个字符串,只有第一个匹配项会被替换。" EX: replaceAll_0("foo bar foo") => “bar foo”应该只是“bar”。 -MDN

解决方案4:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

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

See here also

解决方案5:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

这是一个基于接受的答案的字符串原型函数:

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

编辑

如果您的 find 将包含特殊字符,那么您需要对它们进行转义:

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

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

解决方案6:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

更新:

更新有点晚了,但是因为我刚刚偶然发现了这个问题,并注意到我之前的答案不是我满意的答案。由于问题涉及替换单个单词,令人难以置信的是没有人想到使用单词边界(\b)

'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog');
//"a dog is not a caterpillar"

这是一个简单的正则表达式,可以避免在大多数情况下替换部分单词。但是,破折号 - 仍被视为单词边界。所以在这种情况下可以使用条件来避免替换像 cool-cat 这样的字符串:

'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong
//"a dog is not a cool-dog" -- nips
'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2');
//"a dog is not a cool-cat"

基本上,这个问题与这里的问题相同:Javascript replace " ’ " with " ‘’ "

@Mike,检查我在那里给出的答案…正则表达式不是替换多次出现的subsrting的唯一方法,远非如此。想灵活,想分裂!

var newText = "the cat looks like a cat".split('cat').join('dog');

或者,为了防止替换单词部分 - 批准的答案也会这样做!你可以使用正则表达式来解决这个问题,我承认,这些正则表达式有点复杂,结果也慢了一点:

var regText = "the cat looks like a cat".replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");

输出与接受的答案相同,但是,在此字符串上使用 /cat/g 表达式:

var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog');
//returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

糟糕,这可能不是您想要的。那是什么?恕我直言,一个仅有条件地替换“猫”的正则表达式。 (即不是单词的一部分),如下所示:

var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^a-z]))(([^a-z]*)(?=cat)cat)(?![a-z])/gi,"$1dog");
//return "the dog looks like a dog, not a caterpillar or coolcat"

我的猜测是,这可以满足您的需求。当然,它不是完全证明,但它应该足以让你开始。我建议在这些页面上内容。这将有助于完善此表达式以满足您的特定需求。

http://www.javascriptkit.com/jsref/regexp.shtml

http://www.regular-expressions.info

最后补充:

鉴于这个问题仍然有很多观点,我想我可以添加一个与回调函数一起使用的 .replace 示例。在这种情况下,它极大地简化了表达式 并且 提供了更大的灵活性,例如用正确的大写替换或一次性替换 cat 和 cats:

'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar'.replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2){//check 1st, capitalize if requiredvar replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og';if (char1 === ' ' && char2 === 's'){//replace plurals, toocat = replacement + 's';}else{//do not replace if dashes are matchedcat = char1 === '-' || char2 === '-' ? cat : replacement;}return char1 + cat + char2;//return replacement string});
//returns:
//Two dogs are not 1 Dog! They're just cool-cats, you caterpillar

解决方案7:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

这些是最常见和可读的方法。

var str = "Test abc test test abc test test test abc test test abc"

方法一:

str = str.replace(/abc/g, "replaced text");

方法二:

str = str.split("abc").join("replaced text");

方法三:

str = str.replace(new RegExp("abc", "g"), "replaced text");

方法四:

while(str.includes("abc")){str = str.replace("abc", "replaced text");
}

输出:

console.log(str);
// Test replaced text test test replaced text test test test replaced text test test replaced text

解决方案8:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

匹配全局正则表达式:

anotherString = someString.replace(/cat/g, 'dog');

解决方案9:

huntsbot.com – 高效赚钱,自由工作

更换单次使用:

var res = str.replace('abc', "");

更换多次使用:

var res = str.replace(/abc/g, "");

解决方案10:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

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

或尝试 this answer 中推荐的 replaceAll 方法:

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

或者:

var search = 'abc';
str = str.replaceAll(search, '');

编辑:关于 replaceAll 可用性的说明

replaceAll 方法被添加到 String 的原型中。这意味着它将可用于所有字符串对象/文字。

例子:

var output = "test this".replaceAll('this', 'that'); // output is 'test that'.
output = output.replaceAll('that', 'this'); // output is 'test this'

解决方案11:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

在 JavaScript 中使用 RegExp 可以为您完成这项工作,只需执行类似以下代码的操作,不要忘记 /g 之后的 global:

var str ="Test abc test test abc test test test abc test test abc";
str = str.replace(/abc/g, '');

如果您考虑重用,请创建一个函数来为您执行此操作,但不建议这样做,因为它只是一个行函数,但如果您大量使用它,您可以编写如下内容:

String.prototype.replaceAll = String.prototype.replaceAll || function(string, replaced) {return this.replace(new RegExp(string, 'g'), replaced);
};

并简单地在您的代码中反复使用它,如下所示:

var str ="Test abc test test abc test test test abc test test abc";
str = str.replaceAll('abc', '');

但正如我之前提到的,它不会在要编写的行数或性能方面产生巨大差异,仅缓存函数可能会对长字符串产生更快的性能,并且如果您想重用,也是 DRY 代码的良好实践。

原文链接:https://www.huntsbot.com/qa/EVow/how-to-replace-all-occurrences-of-a-string-in-javascript?lang=zh_CN

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

如何替换 JavaScript 中所有出现的字符串相关推荐

  1. regexp 好汉字符串_如何在JavaScript中使用RegExp确认字符串的结尾

    regexp 好汉字符串 by Catherine Vassant (aka Codingk8) 由凯瑟琳·瓦森(Catherine Vassant)(又名Codingk8) 如何在JavaScrip ...

  2. 在JavaScript中创建多行字符串

    我在Ruby中有以下代码. 我想将此代码转换为JavaScript. JS中的等效代码是什么? text = <<"HERE" This Is A Multiline ...

  3. JavaScript中的数组和字符串

    知识内容: 1.JavaScript中的数组 2.JavaScript中的字符串 一.JavaScript中的数组 1.JavaScript中的数组是什么 数组指的是数据的有序列表,每种语言基本上都有 ...

  4. mysql 5.5 替换字符_Mysql 5.7替换表中某些字段的字符串

    很多时候在做资源迁移的时候,路径改变,存在数据库的资源文件的路径也会跟着改变,所以需要替换存放路径的字符串,如何快速的替换表中的字段的这些字符串呢? 1. 可以通过MySQL的replace函数 re ...

  5. Javascript中得到中英文混合字符串的长度

    有同事在公司的OA上发了个贴子,介绍在javascript中如何得到中英文混合字符串的长度. 用的是正则表达式. var str = "坦克是tank的音译";var len = ...

  6. JavaScript中带示例的字符串search()方法

    字符串search()方法 (String search() Method) search() is method is a String method, it is used to check wh ...

  7. 4种方法替换JavaScript里所有出现的字符串

    在JavaScript代码中出现这个字符串: "Test abc test test abc test test test abc test test abc" 比如直接使用rep ...

  8. 批量替换文本中的多组字符串

    [问题] hi friends, I have the following demand and I want to know if you have any suggestions for me: ...

  9. oracle替换字段中指定位置的字符串

    该方法是以字符串拼接的方式来进行替换 举例:将字符串"BBBBBB"中的前三行"BBB"换成"AAA": --将字符串中的前三行'BBB'换 ...

最新文章

  1. 解析Jquery取得iframe中元素的几种方法
  2. 人少,登录速度就是快.
  3. wxWidgets:wxIconizeEvent类用法
  4. 大公司青睐的50款开源工具
  5. 亚马逊Rekognition发布针对人脸检测、分析和识别功能的多项更新
  6. linux-basic(6)linux的文件权限与目录配置
  7. python 绘图 hist bin参数_Python-hist,distplot bin宽度不一致问题的解决方案
  8. 三层调用关系_你真正的了解MVC三层架构开发模式吗
  9. zabbix替代smokeping的解决方案
  10. html5浏览器提示翻译,IE浏览器自动翻译网页设置方法
  11. Edge(Linux 版)无法正常同步问题解决
  12. 永洪科技发布Yonghong Z-Suite V7.5 重新定义大数据驱动业务增长成功标准
  13. 猫哥教你写爬虫 008--input()函数
  14. 春考计算机组装维修知识点,山东春考计算机组装及维修模拟题.docx
  15. javacv 写mp4_JavaCV教程篇1之springboot调用ffmpeg将webm视频格式转换为MP4格式
  16. 软件设计的七大原则 --开闭原则 里氏替换原则 依赖倒置原则
  17. 软工1816 · 作业(九)团队现场编程实战
  18. php动态创建菜单,php创建无限级树型菜单
  19. 诺基亚e65 ucweb 6.7正式免签名下载
  20. 国标解读:关于超温保护部分(GB 4793.6-2008 测量、控制和实验室用电气设备的安全要求)

热门文章

  1. Java调用Zebra条码打印机打印条码、中英文数字条码混合标签,可自由控制格式和排版
  2. 2022-2028全球与中国夹层升降机市场现状及未来发展趋势
  3. 迅为4412开发板QtE4.7和Qtopia的切换
  4. django自带的权限管理Permission用法
  5. 【虾仁猪心!!】--1
  6. RS导出Excel交叉表角对应的列占用多列问题
  7. Excel下拉框设置多选
  8. 链接数据库明明有值,但是取到的是空
  9. java开发工程师英文_java工程师英文简历范文
  10. 使用 IBM Bluemix 容器构建 Django 环境