替换字符串中字符的所有实例的最快方法

IT技术 javascript string replace
2021-01-31 16:06:38

在 JavaScript 中替换字符串中字符串/字符的所有实例的最快方法是什么?一个while,一个for循环,一个正则表达式?

6个回答

最简单的方法是使用带有g标志的正则表达式来替换所有实例:

str.replace(/foo/g, "bar")

这将替换字符串中所有出现的foowith 如果您只有一个字符串,则可以将其转换为 RegExp 对象,如下所示:barstr

var pattern = "foobar",
    re = new RegExp(pattern, "g");
警告:这不适用于包含换行符的字符串。XRegExp 有一个替换方法可以解决这个问题。
2021-03-11 16:06:38
我内心的学究指出 OP 要求最快的,而不是最简单的
2021-03-16 16:06:38
str.replace(/foo/g, "bar") 对我造成了错误。str.replace(/foo/, "bar") 有效。
2021-03-17 16:06:38
我做了user.email.replace(/./g,','),整个电子邮件被替换为与电子邮件中字符相同数量的逗号。困惑...
2021-03-17 16:06:38
@JaredTomaszewski,正则表达式中的句号(句点)字符代表“任何字符”。要表示实际的句号,您需要在它前面加上一个反斜杠,即 user.email.replace(/\./g,',')
2021-03-19 16:06:38

试试这个replaceAll:http ://dumpsite.com/forum/index.php?topic=4.msg8#msg8

String.prototype.replaceAll = function(str1, str2, ignore) 
{
    return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
} 

它非常快,并且适用于许多其他人无法满足的所有这些条件:

"x".replaceAll("x", "xyz");
// xyz

"x".replaceAll("", "xyz");
// xyzxxyz

"aA".replaceAll("a", "b", true);
// bb

"Hello???".replaceAll("?", "!");
// Hello!!!

让我知道你是否可以打破它,或者你有更好的东西,但要确保它可以通过这 4 项测试。

由于现在有一个标准replaceAll方法,这个答案现在覆盖它。首先通过检查属性的存在来正确地进行猴子修补
2021-03-13 16:06:38
@jens 我要说的是一个巨大的 CAVEAT EMPTOR。RegEx 非常复杂,一个随机的互联网答案本应一劳永逸地解决某人的问题,但它很可能存在一些潜在的错误,这确实是一个糟糕的答案。我们不期望对明显正确的答案进行单元测试——当然不是。但我们确实希望,当一个没有经验的程序员很可能被误导成错误的信心时,这些答案能让读者正确理解他们的风险。我的评论有助于警告那些初学者不要相信这个未经测试的疯狂代码。
2021-03-26 16:06:38
"x".replaceAll("", "xyz"); 的行为 对我来说似乎是一个错误。如果我尝试替换空字符串,我真的希望出现错误。
2021-03-31 16:06:38
这对于替换内容未知的字符串相当不错,但是他的字符串是固定的,不需要转义正则表达式的复杂性。我提高了这个,因为我正在寻找一个 replaceAll 函数。
2021-04-07 16:06:38
我已经开始在这个测试套件的底部为这个函数添加单元测试:github.com/agrothe/alphanumbers/blob/master/test/index.js
2021-04-08 16:06:38
var mystring = 'This is a string';
var newString = mystring.replace(/i/g, "a");

newString 现在是 'Thas as a strang'

这个例程在 Firefox 上是最快的,但在 chrome 上很慢:检查我的答案:stackoverflow.com/a/57697050/236062
2021-03-26 16:06:38

您也可以尝试:

string.split('foo').join('bar');
如果您的指针是某个包含一个或多个正则表达式保留字符的变量,那么其他答案的方法可能会进行意外替换。这种方法的好处是它以相同的方式处理所有字符。
2021-03-16 16:06:38
最佳答案
2021-03-17 16:06:38
@yota 是的。您可以使用正则表达式。"12px (2) bar-456-foo 44".split(/\d/).join("#")
2021-03-26 16:06:38
这对于大多数简单的情况来说是完美的。像一个可爱的小功能伟大的作品:function replaceAll( s, f, r ){ return s.split( f ).join( r ); }或者,如果你认为正则表达式是更快:function replaceAll( s, f, r ){ f = RegExp( f, 'gi' ); return s.replace( f, r ); }然后就做foo = replaceAll( 'aaa', 'a', 'b' );
2021-03-28 16:06:38
这是否处理正则表达式?我猜。但是对于字符串到字符串的替换,这是我最喜欢的 :) 使用 firefox 非常快
2021-04-01 16:06:38

您可以使用以下内容:

newStr = str.replace(/[^a-z0-9]/gi, '_');

或者

newStr = str.replace(/[^a-zA-Z0-9]/g, '_');

这会将所有不是字母或数字的字符替换为 ('_')。简单地更改您想要替换的任何下划线值。

应该是 .replace(/[a-zA-Z0-9]/g, '_') 没有 ^
2021-03-25 16:06:38