2015-12-25 87 views
9

我試圖用符號'%'替換一個以特定符號'@'開頭的字符串,但條件是符號應該位於字符串的開頭。替換以n次符號開始的字符串

例如,

@@@[email protected]@@

%%%[email protected]@@

我已經拿出了起點相匹配的正則表達式來替換「@」符號,但我能代替它只有一次,而不是用它匹配的次數替換它。

的代碼是

var str = "@@@[email protected]@@"; 
var exp = new RegExp('^@+', 'g'); 
var mystr = str.replace(exp, '%'); 

但是,它輸出

%[email protected]@@

但是,預期的輸出是

%%%[email protected]@@

我目前的解決方案是這樣的:

var str = "@@@[email protected]@@"; 
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; 

該解決方案的確給了我預期的輸出,但我擔心的是性能。

有沒有更好的方法來實現這一目標?

+0

如果你的字符串保證以'@@@'開頭,你可以做'var result = str.replace(/^@ +/g,'%%%');'? – AdamJeffers

+0

不,這只是一個例子。所以出現的次數可能會改變。 –

回答

6

你可以使用一個回調函數:

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

Array(n).join(s)建設是簡單地重複字符串sn-1倍的簡寫方式。

+0

哇,很好的解決方案...它的工作。 –

+0

或'return'%'。repeat(match.length)'如果有可用的話。 –

+0

@tor'String.prototype.repeat = function(num){return new Array(++ num).join(this)};' – bjb568

2

沒有正則表達式的一個有趣的解決方案:

var mystr = '@@@@@[email protected]@@'.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('@@@@@[email protected]@@', function(item) { 
    if (item == '@' && !this.stop) { 
     return '%'; 
    } else { 
     this.stop = true; 
     return item; 
    } 
    }, {}).join(''); 

    console.log(mystr); 
+1

不錯的解決方案..但是this.stop沒有定義,所以你必須定義它首先是假的。 –

+1

@adirohan最初「停止」是「未定義的」,所以它的作用是「虛假」。 –

+1

這會在窗口放置一個「停止」屬性,可能不是你想要的。 –

2

你可以不用一個回調函數作爲替代使用此模式:

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

顯然,如果您已經知道第一個字符總是@,則刪除if條件。

如果您的字符串有換行符,請用[^][\s\S]替換點。