2016-05-29 31 views
7

のは、私は、文字列があるとしましょう:は、n繰り返し回数

"__3_" 

...私はに変身したいと思います:

"__###_" 

基本的に交換を整数値に等しい#の繰り返し出現を伴う整数。どうすればこれを達成できますか?

私は後方参照がstr.replace()

var str = '__3_' 
str.replace(/[0-9]/g, 'x$1x')) 
> '__x3x_' 

で使用することができることを我々は文字列のシーケンスをn回繰り返すstr.repeat(n)を使用できることを理解しています。

しかし、.replace()の逆参照を.repeat()の引数として使用するにはどうすればよいですか?たとえば、これは動作しません:

str.replace(/([0-9])/g,"#".repeat("$1")) 
+2

'/(x)\ 1 /'は 'xx"にマッチします。 '\ 1'は後方参照です。 "$ 1"は後方参照ではなく、特別な置換パターンです。 – leaf

答えて

7
"__3_".replace(/\d/, function(match){ return "#".repeat(+match);}) 

をあなたはバベルまたは他のES6ツールを使用する場合は"#".repeat(11)__11+を交換する必要がある場合、それは

"__3_".replace(/\d/, match => "#".repeat(+match)) 

になります - /\d+/

に正規表現に変更します

それはあなたが欲しいものですか?

よるhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

str.replace(正規表現| SUBSTR、newSubStr |機能)

と2番目のparamとしての機能を使用する場合

機能(交換) A (パラメータ#1から受け取った>部分文字列の代わりに置く)新しい部分文字列を作成するために呼び出される関数です。この関数に渡される引数については、後述の「関数をパラメータとして指定する」で説明しています。

+1

実際には '+'は必要ありません。 – ryeballar

+0

答えをありがとう、ええ、そのトリックを行う必要があります。 –

+0

@ryeballar実際にあなたがしています。そうでなければ、 '11'は' ##########'の代わりに '##'に置き換えられます。待ち時間なし '+ match 'が' match'に置き換えられた編集を見ました。しかし、正規表現は '/ \ d +/g'に変更する必要があります –

5

これを試してみてください:

var str = "__3_"; 
 

 
str = str.replace(/[0-9]+/, function(x) { 
 
     
 
    return '#'.repeat(x); 
 
}); 
 

 
alert(str);

+0

残念ながら、@ Vasiliyは少し答えました早く –

0

はこれを試してみてください:

var str = "__3_"; 
str = str.replace(/[0-9]/g,function(a){ 
    var characterToReplace= '#'; 
    return characterToReplace.repeat(a) 
}); 
2

昔ながらのアプローチ:

"__3__".replace(/\d/, function (x) { 
    return Array(+x + 1).join('#'); 
}); 
関連する問題