Sostituisci più caratteri in una chiamata di sostituzione


257

Piccola domanda molto semplice, ma non capisco bene come farlo.

Devo sostituire ogni istanza di '_' con uno spazio e ogni istanza di '#' con nulla / vuota.

var string = '#Please send_an_information_pack_to_the_following_address:';

Ho provato questo:

string.replace('#','').replace('_', ' ');

Non mi piace concatenare comandi come questo. C'è un altro modo per farlo in uno?


Vedere la risposta a questa domanda: stackoverflow.com/questions/7072330/...
DeweyOx

Risposte:


517

Utilizzare l'operatore OR ( |):

var str = '#this #is__ __#a test###__';
str.replace(/#|_/g,''); // result: "this is a test"

Puoi anche usare una classe di caratteri:

str.replace(/[#_]/g,'');

Violino

Se vuoi sostituire l'hash con una cosa e il carattere di sottolineatura con un'altra, dovrai solo fare una catena. Tuttavia, è possibile aggiungere un prototipo:

String.prototype.allReplace = function(obj) {
    var retStr = this;
    for (var x in obj) {
        retStr = retStr.replace(new RegExp(x, 'g'), obj[x]);
    }
    return retStr;
};

console.log('aabbaabbcc'.allReplace({'a': 'h', 'b': 'o'}));
// console.log 'hhoohhoocc';

Perché non incatenare, però? Non vedo nulla di male in questo.


È fantastico, ma devo sostituire i trattini bassi con spazi non vuoti, posso farlo?
Shannon Hochkins,

Pensato di sì, ma mi hai ancora aiutato a capire come le espressioni sostitutive funzionano un po 'meglio :)
Shannon Hochkins,

Il tuo prototipo non funziona? sei in grado di fornire un esempio sul violino, continuo a ricevere errori
Shannon Hochkins,

3
Un'altra opzione #|_è [#_], e potresti anche usare +per abbinare qualsiasi partita consecutiva per migliorare le prestazioni
Ian

3
Fantastico grazie ... se necessario sostituisci gli spazi vuoti e un altro simbolo str.replace(/[+ -]/g,'');mette semplicemente uno spazio vuoto nel mezzo.
equiman,

53

Il concatenamento è bello, perché scartarlo?

Comunque, ecco un'altra opzione in una sostituzione:

string.replace(/#|_/g,function(match) {return (match=="#")?"":" ";})

Il sostituto sceglierà "" if match == "#", "" in caso contrario.

[Aggiornamento] Per una soluzione più generica, è possibile memorizzare le stringhe di sostituzione in un oggetto:

var replaceChars={ "#":"" , "_":" " };
string.replace(/#|_/g,function(match) {return replaceChars[match];})

4
fai il passo in più: var regex = new RegExp( Object.keys(replaceChars).join("|"), "g"); string.replace(regex,function(match) {return replaceChars[match];})questo semplifica la modifica di replaceChars.
RozzA

@RozzA grazie. Object.keys non era mainstream al momento.
Christophe,

Ho completamente dimenticato l'opzione di sostituzione della funzione per sostituire il secondo parametro, per aiutarmi a ricordare :)
Luckylooke

48

Se si desidera sostituire più caratteri, è possibile chiamare String.prototype.replace()con l'argomento di sostituzione che è una funzione che viene chiamata per ogni corrispondenza. Tutto ciò di cui hai bisogno è un oggetto che rappresenti la mappatura dei caratteri che utilizzerai in quella funzione.

Ad esempio, se vuoi asostituirlo con x, bcon ye ccon z, puoi fare qualcosa del genere:

var chars = {'a':'x','b':'y','c':'z'};
var s = '234abc567bbbbac';
s = s.replace(/[abc]/g, m => chars[m]);
console.log(s);

Uscita :234xyz567yyyyxz


3
poiché si utilizza ES6 (funzione freccia), è necessario sostituire anche varcon constqui. un'alternativa per il supporto esteso del browser:var s ='234abc567bbbbac'; s = s.replace(/[abc]/g, function(m) { return {'a':'x','b':'y','c':'z'}[m]; }); console.log(s);
Felix Geenen,

1
@FelixGeenen 1. si uccide la portabilità 2. se si sceglie di ridefinire i caratteri, si otterrà un errore di runtime, che uccide la sua robustezza, 3. non vi è alcuna garanzia per proteggere s dalla mutazione e dal rifiuto diverso da quelli puramente ideologici. È meraviglioso vedere che questo frammento funzionerà ancora su Windows98 appena installato con un doppio clic / cscript / wscript:var chars = {a:'1', b:'2', c:'3'}; var s = '123abc123'; var u = s.replace(/[abc]/g, function(m) { return chars[m]; }); WScript.echo(u);
Dmitry,

questo è veramente buono. Grazie. Qual è la parte in cui hai usato un oggetto per fare un'istruzione o. hai documentazione o riferimento a qualcosa che lo spiega. Caso d'uso abbastanza buono.
Christian Matthew,

39

Specifica il /gflag (globale) sull'espressione regolare per sostituire tutte le corrispondenze anziché solo la prima:

string.replace(/_/g, ' ').replace(/#/g, '')

Per sostituire un personaggio con una cosa e un personaggio diverso con qualcos'altro, non si può davvero andare in giro necessitando di due chiamate separate replace. Puoi astrarlo in una funzione come ha fatto Doorknob, anche se probabilmente lo farei prendere un oggetto con coppie vecchio / nuovo come coppie chiave / valore anziché un array piatto.


come dovrei includere anche l'hash?
Shannon Hochkins,

4

Puoi anche provare questo:

function replaceStr(str, find, replace) {
    for (var i = 0; i < find.length; i++) {
        str = str.replace(new RegExp(find[i], 'gi'), replace[i]);
    }
    return str;
}

var text = "#here_is_the_one#";
var find = ["#","_"];
var replace = ['',' '];
text = replaceStr(text, find, replace);
console.log(text);

findsi riferisce al testo da trovare e replaceal testo da sostituire

Questo sostituirà i caratteri insensibili alle maiuscole. Per fare diversamente, basta cambiare le bandiere Regex come richiesto. Ad esempio: per la distinzione tra maiuscole e minuscole sostituire:

new RegExp(find[i], 'g')

4

Puoi semplicemente provare questo:

str.replace(/[.#]/g, 'replacechar');

questo sostituirà., - e # con il vostro replacechar!


Questa risposta è già stata fornita e non gestisce la sostituzione di caratteri diversi con altri caratteri, vedere OP.
Shannon Hochkins,

3

Ecco un modo semplice per farlo senza RegEx.
È possibile prototipare e / o memorizzare nella cache le cose come desiderato.

// Example: translate( 'faded', 'abcdef', '123456' ) returns '61454'
function translate( s, sFrom, sTo ){
    for ( var out = '', i = 0; i < s.length; i++ ){
        out += sTo.charAt( sFrom.indexOf( s.charAt(i) ));
    }
    return out;
}

So che non l'hai dichiarato, ma non è molto più elegante usare solo regex? str.replace(/#|_/g,'')
Shannon Hochkins,

1
@ShannonHochkins Di sicuro! Non intendo bash su RegEx; Sto solo mostrando un'altra opzione. RegEx non è sempre intuitivo e si presta ad essere utilizzato "come un martello, trattando ogni problema come un chiodo". Inoltre, guardando le altre risposte, come funzione riutilizzabile questa non è molto più lunga e i parametri sono facili da capire. Personalmente sceglierei un breve RegEx per la domanda qui, e ha senso se stai solo cercando un frammento rapido che non ti dispiace non capire completamente.
Beejor,

Bene, se hai bisogno di tradurre un carattere (à il comando sed y o Unix tr), questa sembra la risposta giusta.
Édouard,

3

Vi preghiamo di provare:

  • sostituire più stringhe

    var str = "http://www.abc.xyz.com"; str = str.replace(/http:|www|.com/g, ''); //str is "//.abc.xyz"

  • sostituire più caratteri

    var str = "a.b.c.d,e,f,g,h"; str = str.replace(/[.,]/g, ''); //str is "abcdefgh";

In bocca al lupo!


2

Puoi anche passare un oggetto RegExp al metodo di sostituzione come

var regexUnderscore = new RegExp("_", "g"); //indicates global match
var regexHash = new RegExp("#", "g");

string.replace(regexHash, "").replace(regexUnderscore, " ");

Javascript RegExp


OP non vuole concatenare le replacechiamate - questo non aiuta a evitarlo.
Dennis,

2

yourstring = '#Please send_an_information_pack_to_the_following_address:';

sostituire "#" con "" e sostituire "_" con uno spazio

var newstring1 = yourstring.split('#').join('');
var newstring2 = newstring1.split('_').join(' ');

newstring2 è il tuo risultato


La tua risposta non utilizza un frammento di jQuery e inoltre non segue l'OP, '#this #is__ #a test ### ' .split ('_'). Join ('') non funzionerebbe come
finiresti

@ShannonHochkins Quanto verranno aggiunti più spazi bianchi?
Hafsul Maru,

Dai un'occhiata al mio esempio, quando c'è un carattere di sottolineatura prima di uno spazio o due caratteri di sottolineatura, finirai con più spazi.
Shannon Hochkins,

@ShannonHochkins l'interrogatore si occupa della stringa '#Si prega di inviare_informazioni_pack_to_dell'indirizzo:'; non c'è spazio qui. perché ci penserò. quando pensi, perché solo riguardo allo spazio, possono accadere molte altre cose.
Hafsul Maru,

Ti suggerisco di leggere l'OP, sono il poster originale e puoi vedere chiaramente nella mia prima variabile var str = '#this #is__ __#a test###__';che ci sono chiaramente più spazi in questa stringa.
Shannon Hochkins,

2

Ecco un'altra versione che utilizza String Prototype. Godere!

String.prototype.replaceAll = function(obj) {
    let finalString = '';
    let word = this;
    for (let each of word){
        for (const o in obj){
            const value = obj[o];
            if (each == o){
                each = value;
            }
        }
        finalString += each;
    }

    return finalString;
};

'abc'.replaceAll({'a':'x', 'b':'y'}); //"xyc"

1

Non so se questo aiuterà, ma volevo rimuovere <b>e </b>dalla mia stringa

così ho usato

mystring.replace('<b>',' ').replace('</b>','');

quindi in pratica se vuoi ridurre un numero limitato di personaggi e non perdere tempo, questo sarà utile.


-1

Ecco una funzione "HTML sicuro" che utilizza una funzione di sostituzione multipla "riduci" (questa funzione applica ogni sostituzione all'intera stringa, quindi le dipendenze tra le sostituzioni sono significative).

// Test:
document.write(SafeHTML('<div>\n\
    x</div>'));

function SafeHTML(str)
    {
    const replacements = [
        {'&':'&amp;'},
        {'<':'&lt;'},
        {'>':'&gt;'},
        {'"':'&quot;'},
        {"'":'&apos;'},
        {'`':'&grave;'},
        {'\n':'<br>'},
        {' ':'&nbsp;'}
        ];
    return replaceManyStr(replacements,str);
    } // HTMLToSafeHTML

function replaceManyStr(replacements,str)
    {
    return replacements.reduce((accum,t) => accum.replace(new RegExp(Object.keys(t)[0],'g'),t[Object.keys(t)[0]]),str);
    }

Grazie per il post, tuttavia è piuttosto esteso rispetto alla risposta accettata
Shannon Hochkins,

La risposta alla domanda è una funzione di una riga. Come è "esteso"? Rendere sicuro l'input dell'utente è un esempio importante. Sei troppo critico. 'ridurre' è una tecnica molto utile che dovresti conoscere.
David Spector,

Ho detto che la tua risposta è troppo estesa, è molto più codice, stai comunque usando espressioni regolari, rendendo il processo troppo complicato, non sono sicuro di come pensi che la tua risposta sia una riduzione rispetto a una di queste risposte ...
Shannon Hochkins,

La mia risposta è una "riduzione" perché utilizza la funzione Array.prototype.reduce. Una risposta più breve potrebbe utilizzare una stringa anziché le chiavi di proprietà, sfruttando il fatto che una funzione "HTML sicura" funziona solo per sostituire singoli caratteri. Ti sfido a trovare una risposta più elegante invece di lamentarti bruscamente in pubblico come questo.
David Spector,

In realtà ho detto grazie, e ti ho dato delle critiche, tu l'hai preso e hai deciso di scrivere qualcosa di insopportabile, se inizieremo con metodi funzionali per eseguire piuttosto che metodi concatenati come dovremmo essere, quindi qualcosa di molto più semplice come: jsfiddle .net / shannonhochkins / xsm9j610 / 21
Shannon Hochkins
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.