2015-12-25 17 views
9

'%' sembolü ile başlayan belirli bir sembolle başlayan bir diziyi '%' sembolü ile değiştirmeye çalışıyorum, ancak koşul, sembolün dizenin başında olması gerektiği. Örneğin,Dizgeyi bir sembolle başlayarak değiştirin n saat

.

@@@[email protected]@@

sembolleri '@' ı başlangıç ​​maçları regex ile geldi

%%%[email protected]@@

yerini ama yerine, sadece bir kez değiştirmek mümkün duyuyorum edilmelidir eşleştiği sayıda değiştirerek.

kod

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

olduğu Ama,

%[email protected]@@

verir Fakat, amaçlanan çıktı My şimdiki çözüm böyle bir şeydir

%%%[email protected]@@

geçerli:

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; 

Bu çözüm bana istenen çıktıyı veriyor, ancak performans konusunda endişeleniyorum.

Bunu başarmanın daha iyi bir yolu var mı?

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

Array(n).join(s) inşaat basitçe dize sn-1 kez tekrarlayarak bir stenografi yoludur:

+0

Dizenizin '@@@' ile başlaması garantiliyse, sadece var result = str.replace (/^@ +/g, '%%%'); '? – AdamJeffers

+0

Hayır, bu sadece bir örnekti. Yani olayların sayısı değişebilir. –

cevap

6

Bir geri arama işlevini kullanabilirsiniz.

+0

Vay, güzel çözüm ... işe yaradı. –

+0

Veya '%' döndürün. Eğer varsa, tekrarlayın (match.length). –

+0

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

2

regexp olmadan ilginç bir çözüm:

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

    console.log(mystr); 

Ve bir alternatif: Açıkçası

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

:

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

hoş bir çözüm..but this.stop tanımlı değil, tanımlamanız gerekecek İlk önce yanlış. –

+1

@adirohan Başlangıçta "dur", "undefined", yani bir "falsy" çalışır. –

+1

Bu, pencerede bir 'dur' özelliği koyacaktır, muhtemelen istediğinizi değil. –

2

Bu desenle yedek olarak bir geri arama fonksiyonu olmadan bunu yapabilir Eğer ilk karakterin her zaman bir @ olduğunu biliyorsanız, if koşulunu kaldırın.

Dizginiz yeni satırlarda varsa, noktayı [^] veya [\s\S] ile değiştirin.

İlgili konular