用符号

时间:2015-12-25 15:42:13

标签: javascript regex

我正在尝试替换以特定符号开头的字符串' @'使用符号'%',但条件是符号应位于字符串的开头。

例如。

@@@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 个答案:

答案 0 :(得分:6)

您可以使用回调函数:

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

Array(n).join(s)构造只是重复字符串s n-1次的简便方法。

答案 1 :(得分:2)

没有正则表达式的有趣解决方案:

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

答案 2 :(得分:2)

你可以在没有回调函数的情况下完成这个模式:

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

显然,如果您已经知道第一个字符始终是@,请删除if条件。

如果您的字符串有换行符,请用[^][\s\S]替换该点。