2016-05-29 6 views
7

Diciamo che ho una stringa:Sostituzione di un intero (n) con un carattere ripetuto n volte

"__3_" 

... che vorrei trasformare in:

"__###_" 

fondamentalmente la sostituzione di un intero con ripetute occorrenze di # equivalenti al valore intero. Come posso raggiungere questo obiettivo?

Capisco che backreference possono essere utilizzati con str.replace()

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

e che possiamo utilizzare str.repeat(n) per ripetere sequenze di stringa n volte.

Ma come è possibile utilizzare il backreference da .replace() come argomento di .repeat()? Ad esempio, questa non funziona:

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

'/ (x) \ 1 /' corrisponde a "xx" dove '\ 1' è un riferimento all'indietro. "$ 1" non è un riferimento posteriore, è un modello di sostituzione speciale. – leaf

risposta

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

se si utilizza babel o altro strumento ES6 Sarà

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

se è necessario sostituire __11+ con "#".repeat(11) - cambiamento regexp in /\d+/

è quello che vuoi?

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

str.replace (regexp | substr, newSubStr | funzione)

e se si utilizza la funzione come secondo parametro

funzione (sostituzione) A funzione da invocare per creare la nuova sottostringa (per inserire la> sottostringa ricevuta dal parametro # 1). Gli argomenti forniti per questa funzione> sono descritti nella sezione "Specificare una funzione come parametro" di seguito.

+1

In realtà non è necessario il '+'. – ryeballar

+0

Grazie per la risposta, sì che dovrebbe fare il trucco. –

+0

@ryeballar effettivamente lo fai. Altrimenti '11' si sostituirebbe con' ## 'invece di' ###########', ecc. Aspettate che io abbia appena guardato la modifica, dove '+ match' è stato sostituito con' match'.Ma il regexp deve essere cambiato in '/ \ d +/g' –

5

Prova questo:

var str = "__3_"; 
 

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

 
alert(str);

+0

Grazie per la risposta, purtroppo, @Vasiliy ha risposto un po ' in precedenza. –

0

Prova questa:

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

Vecchio approccio stile:

"__3__".replace(/\d/, function (x) { 
    return Array(+x + 1).join('#'); 
});