用符号替换字符串n次

adi*_*han 9 javascript regex

我试图用符号'%'替换以特定符号'@'开头的字符串,但条件是符号应该在字符串的开头.

例如.

@@@hello@hi@@

应该被替换

%%%hello@hi@@

我提出了与起始'@'符号匹配的正则表达式,但我只能将它替换一次,而不是用它匹配的次数替换它.

代码是

var str = "@@@hello@hi@@";
var exp = new RegExp('^@+', 'g');
var mystr = str.replace(exp, '%');
Run Code Online (Sandbox Code Playgroud)

但是,它输出

%hello@hi@@

但是,预期的输出是

%%%hello@hi@@

我目前的解决方案是这样的:

var str = "@@@hello@hi@@";
var match = str.match(/^@+/g)[0];

var new_str = str.replace(match, "");

var diff_count = str.length-new_str.length;
var new_sub_str = Array(diff_count+1).join("%")

var mystr = new_sub_str + new_str;
Run Code Online (Sandbox Code Playgroud)

这个解决方案确实给了我预期的输出,但我担心性能.

有没有更好的方法来实现这一目标?

Doo*_*nob 6

您可以使用回调函数:

var mystr = '@@@hello@hi@@'.replace(/^@+/g, function(match) {
  return Array(match.length + 1).join('%');
});
document.write(mystr);
Run Code Online (Sandbox Code Playgroud)

Array(n).join(s)建筑是简单地重复字符串的简写方式s n-1倍.