给出一个字符串:
s = "Test abc test test abc test test test abc test test abc";这似乎只删除了上面字符串中第一个出现的abc:
s = s.replace('abc', '');我如何替换它的所有事件?
发布于 2009-07-17 20:29:12
在大多数流行浏览器的最新版本中,您可以使用replaceAll,如下所示:
let result = "1 abc 2 abc 3".replaceAll("abc", "xyz");
// `result` is "1 xyz 2 xyz 3"但是,首先检查我能用一下吗或其他兼容性表,以确保您针对的浏览器首先添加了对它的支持。
对于Node.js和与旧的/非当前浏览器的兼容性:
注意:在性能关键代码中不要使用以下解决方案.
作为简单文字字符串的正则表达式的替代方法,可以使用
str = "Test abc test test abc test...".split("abc").join("");一般的模式是
str.split(search).join(replacement)在某些情况下,这比使用replaceAll和正则表达式要快,但在现代浏览器中似乎不再是这样了。
结论:
如果您有一个性能关键的用例(例如,处理数百个字符串),请使用正则表达式方法。但是对于大多数典型的用例来说,这是非常值得的,不必担心特殊的角色。
发布于 2009-07-17 17:54:49
截至2020年8月的:由ECMAScript 2021语言规范定义的方法的 现代浏览器支持。
用于旧版/旧版浏览器的:
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, '');在回应单击“向上”的评论时,你可以把它简化得更简单:
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);
}发布于 2013-07-12 01:46:24
为了完整起见,我不得不考虑应该使用哪种方法来完成这项工作。基本上有两种方法可以做到这一点,如本页的其他答案所建议的那样。
注意:一般情况下,不建议在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);
};由于不太了解正则表达式在幕后的工作效率,我倾向于过去的拆分和加入实现,而不考虑性能。当我想知道哪一个更有效率,有多大的差距时,我就用它作为找出答案的借口。
在我的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),那就太好了,但是遗憾的是,它并不存在:
function escapeRegExp(str) {
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
}我们可以在我们的escapeRegExp实现中调用String.prototype.replaceAll,但是,我不确定这会对性能产生多大的影响(甚至对于那些不需要转义的字符串,就像所有字母数字字符串一样)。
https://stackoverflow.com/questions/1144783
复制相似问题