Заменить строку, начинающуюся с символа n раз

Я пытаюсь заменить строку, начинающуюся с определенного символа " @ "символом"%", но условие заключается в том, что символ должен быть в начале строки.

например.

@@@hello@hi@@

следует заменить на

%%%hello@hi@@

Я придумал регулярное выражение, которое соответствует начальным символам"@", но я могу заменить его только один раз, вместо того, чтобы заменять его количеством раз соответствие.

код

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

но, он выводит

%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;

это решение дает мне предполагаемый результат, но я беспокоюсь о производительности.

есть ли лучший способ добиться этого ?

3 ответов


вы можете использовать функцию обратного вызова:

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

на Array(n).join(s) конструкция - это просто сокращенный способ повторения строки s n-1 раза.


интересное решение без regexp:

var mystr = '@@@@@hello@hi@@'.split('').map(function(item) {
    if (item == '@' && !this.stop) {
      return '%';
    } else {
      this.stop = true;
      return item;
    }
  }, {}).join('');

  console.log(mystr);

и альтернативы:

var mystr = Array.prototype.map.call('@@@@@hello@hi@@', function(item) {
    if (item == '@' && !this.stop) {
      return '%';
    } else {
      this.stop = true;
      return item;
    }
  }, {}).join('');

  console.log(mystr);

вы можете сделать это без функции обратного вызова в качестве замены с этим рисунком:

if (mystr.charAt(0)=='@')
    mystr = mystr.replace(/@((?=@)|.*)/g, '%%');

очевидно, если вы уже знаете, что первый символ всегда является@, удалите условие if.

Если ваша строка имеет новые строки, замените точку на [^] или [\s\S].