2012-03-29 26 views
194

Sono così vicino a questo, ma non è giusto. Tutto ciò che mi piacerebbe fare è rimuovere il carattere "r" da una stringa. Il problema è che c'è più di un'istanza di "r" nella stringa. Tuttavia, è sempre il quarto carattere.Come posso rimuovere un carattere da una stringa usando Javascript?

esempio stringa: "CRT/r2002_2" Quello che voglio: "CRT/2002_2"

Questa sostituire funzione rimuove sia "r"

mystring.replace(/r/g, '') 

Produce: "ct/2002_2"

ho provato questa funzione:

String.prototype.replaceAt = function (index, char) { 
return this.substr(0, index) + char + this.substr(index + char.length); 
} 
mystring.replaceAt(4, '') 

funziona solo se sostituisco con un altro personaggio. Non lo rimuoverà semplicemente.

Qualche idea?

+0

Qual è il modello? Vuoi rimuovere il primo carattere dopo la barra? –

+0

sostituire "r2002" con "2002" –

+0

Does string.replaceAt ('r') sostituisce la prima istanza di 'r' nella stringa? – Kailas

risposta

3
return this.substr(0, index) + char + this.substr(index + char.length); 

char.length è zero. È necessario aggiungere 1 in questo caso per saltare il carattere.

+0

Questo non risponde alla domanda posta; spiega semplicemente perché 'replaceAt' non funziona. Dovrebbe essere un commento alla domanda originale invece di una risposta. :) –

+0

@KenWhite, infatti risponde all'unica domanda, "Qualche idea?". –

+1

Per quanto ne so non c'è differenza tra una stringa e Char in JS .. – paislee

282
var mystring = "crt/r2002_2"; 
mystring = mystring.replace('/r','/'); 

sostituirà /r con / utilizzando String.prototype.replace.

In alternativa è possibile utilizzare regex (con un flag globale (come suggerito da Erik Reppen & Sagar Gala, di seguito)) per sostituire tutte le occorrenze con

mystring = mystring.replace(/\/r/g, '/'); 
+1

Oh sì, duh. Grazie! Ci sono un sacco di ottime risposte qui e molte funzioneranno. Questo è il più facile per quello di cui ho bisogno. – user1293504

+3

@ user1293504, se questo risponde alla tua domanda dovresti accettarlo. Ciò consente agli altri di sapere che il tuo problema è stato risolto.Per informazioni sull'accettazione, leggi [FAQ] (http://stackoverflow.com/faq) e per informazioni sul motivo per cui dovresti farlo leggi questo [meta post] (http://meta.stackexchange.com/questions/ 5234/come-non-accettare-una-risposta-lavoro). Grazie. :) –

+1

Non lo so. Mi sono fermato per vedere quale risposta è stata accettata e ho notato che nessuno era stato; poi ho visto il commento di questa risposta dall'OP, e ho pensato di lasciare un promemoria per accettare. (Ho anche svalutato mentre ero qui, mentre la mia risposta funziona, la tua più direttamente risponde alla domanda.) –

38

C'è sempre la funzioni di stringa, se sai che sei sempre andando a rimuovere il quarto carattere:

str.slice(0, 4) + str.slice(5, str.length)) 
1

Se è sempre il 4 ° char in StringaBella si può provare:

yourString.replace(/^(.{4})(r)/, function($1, $2) { return $2; }); 
2

Funziona solo se lo sostituisco con un altro carattere. Non lo rimuoverà semplicemente.

Questo perché quando char è uguale a "", char.length è 0, in modo che le stringhe si combinano per formare la stringa originale. Andare con il tentativo di codice, il seguente funziona:

String.prototype.replaceAt = function (index, char) { 
    return this.substr(0, index) + char + this.substr(index + 1); 
    // this will 'replace' the character at index with char^
} 
4

Basta risolvere il tuo replaceAt:

String.prototype.replaceAt = function(index, charcount) { 
    return this.substr(0, index) + this.substr(index + charcount); 
} 

mystring.replaceAt(4, 1); 

lo chiamerei removeAt invece. :)

21

La prima funzione è quasi corretta.Basta rimuovere il flag "g" che sta per "global" (modifica) e dargli un contesto per individuare la seconda "r".

Modifica: non ha visto che era la seconda 'r' prima quindi aggiunto il '/'. È necessario \/per uscire da '/' quando si utilizza un argomento regEx. Grazie per i upvotes ma mi sbagliavo quindi mi preparo e aggiungere ulteriori dettagli per le persone interessate a comprendere i principi fondamentali di espressione regolare meglio, ma questo dovrebbe funzionare:

mystring.replace(/\/r/, '/') 

Ora per la spiegazione eccessiva:

Durante la lettura/scrittura di un modello di regEx pensare in termini di: < un carattere o un insieme di charcters > seguita da < un carattere o un insieme di charcters > seguita da < ...

in regEx < un carattere o un insieme di charcters > potrebbe essere una alla volta:

/each char in this pattern/ 

modo di leggere come e, seguito da una, seguita da c, ecc ...

o un singolo < un personaggio o set di charcters > potrebbe essere caratteri descritto da una classe di caratteri:

/[123!y]/ 
//any one of these 
/[^123!y]/ 
//anything but one of the chars following '^' (very useful/performance enhancing btw) 

o espanso in modo che corrisponda una quantità di personaggi (ma ancora meglio a pensare come un unico elemento in termini di picchiettio sequenziale n):

/a{2}/ 
//precisely two 'a' chars - matches identically as /aa/ would 

/[aA]{1,3}/ 
//1-3 matches of 'a' or 'A' 

/[a-zA-Z]+/ 
//one or more matches of any letter in the alphabet upper and lower 
//'-' denotes a sequence in a character class 

/[0-9]*/ 
//0 to any number of matches of any decimal character (/\d*/ would also work) 

Così Smoosh un mucchio insieme:

var rePattern = /[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/g 
    var joesStr = 'aaaAAAaaEat at Joes123454321 or maybe aAaAJoes all you can eat098765'; 

    joesStr.match(rePattern); 

    //returns ["aaaAAAaaEat at Joes123454321", "aAaAJoes all you can eat0"] 
    //without the 'g' after the closing '/' it would just stop at the first match and return: 
    //["aaaAAAaaEat at Joes123454321"] 

E naturalmente ho elaborato troppo ma il mio punto era semplicemente che questo:

/cat/ 

è una serie di 3 elementi del modello (una cosa seguita da una cosa seguita da una cosa).

E così è questo:

/[aA]{4,8}(Eat at Joes|Joes all you can eat)[0-5]+/ 

stravagante come RegEx comincia a guardare, tutto si esaurisce ad una serie di cose (potenzialmente le cose più caratteri) si susseguono in sequenza. Una specie di punto di base, ma che mi ha portato un po 'a passare oltre, quindi ho esagerato spiegandole qui perché penso che sia una cosa che aiuterebbe l'OP e altre novità a regEx a capire cosa sta succedendo. La chiave per leggere/scrivere regEx è scomposizione in quei pezzi.

6

Per la sostituzione globale di "/ r", questo codice ha funzionato per me.

mystring = mystring.replace(/\/r/g,''); 
0

Non mi piace usare la funzione di sostituzione per rimuovere i caratteri dalla stringa. Non è logico farlo in quel modo. Di solito programma in C# (Sharp) e ogni volta che voglio rimuovere i caratteri dalla stringa, uso il metodo Remove della classe String, ma non il metodo Replace, anche se esiste, perché quando sto per rimuovere, rimuovo, nessuna sostituzione. Questo è logico!

In Javascript, non esiste alcuna funzione di rimozione per la stringa, ma esiste una funzione di substr. È possibile utilizzare la funzione substr una o due volte per rimuovere i caratteri dalla stringa. È possibile effettuare la seguente funzione per rimuovere i caratteri a indice di partenza alla fine della stringa, proprio come il metodo C# primo overload String.Remove (int startIndex):

function Remove(str, startIndex) { 
    return str.substr(0, startIndex); 
} 

e/o si può anche fare la seguente funzione per rimuovere i caratteri a indice iniziale e contare, proprio come il metodo C# secondo sovraccaricare String.Remove (int startIndex, int count):

function Remove(str, startIndex, count) { 
    return str.substr(0, startIndex) + str.substr(startIndex + count); 
} 

e quindi è possibile utilizzare queste due funzioni o uno di loro per le vostre esigenze!

Esempio:

alert(Remove("crt/r2002_2", 4, 1)); 

uscita: CRT/2002_2

Raggiungere gli obiettivi di fare le tecniche con alcuna logica potrebbe causare confusione nella comprensione del codice, e gli errori futuri, se lo fai molto in un grande progetto!

+2

Direi che l'introduzione di metodi estranei è molto più confusa che solo usando 'String.prototype.replace', che è una parte dell'API di base. Inoltre, comprendere la rimozione come caso speciale di sostituzione è abbastanza logico per quanto riguarda la programmazione. Non dovresti tentare di far comprendere all'API tutte le parole del dizionario inglese, dovresti provare a ridurre la tua API alla sua base ortogonale minima. – Witiko

1

In C# (Sharp), è possibile creare un carattere vuoto come '\ 0'. Forse si può fare questo:

String.prototype.replaceAt = function (index, char) { 
return this.substr(0, index) + char + this.substr(index + char.length); 
} 
mystring.replaceAt(4, '\0') 

ricerca su Google o navigare su interent e verificare se javascript consente di effettuare i caratteri vuoti, come C# fa. Se sì, allora impara come farlo, e forse la funzione replaceAt funzionerà alla fine e otterrai ciò che vuoi!

Infine quel carattere 'r' verrà rimosso!

36

Un modo semplice JavaScript funzionale sarebbe

mystring = mystring.split('/r').join('/')

semplice, veloce, sostituire globalmente e senza bisogno di funzioni o prototipi

+1

Funziona benissimo per me. Mentre provo mystring = mystring.replace ('/ r', '/'); converte solo il primo correttore, il resto di loro è così com'è. –

+0

Penso che sia la soluzione migliore, molto semplice e non è necessario conoscere regex per questo! –

Problemi correlati