2012-03-29 5 views
194

Ich bin so nah dran, das zu bekommen, aber es ist einfach nicht richtig. Alles, was ich tun möchte, ist das Zeichen "r" aus einer Zeichenfolge entfernen. Das Problem ist, es gibt mehr als eine Instanz von "r" in der Zeichenfolge. Es ist jedoch immer das 4. Zeichen.Wie kann ich ein Zeichen aus einer Zeichenkette mit Javascript entfernen?

Beispiel string: "crt/r2002_2" Was ich will: "crt/2002_2"

Funktion Diese ersetzen entfernt sowohl "r"

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

Produziert: "ct/2002_2"

ich habe versucht, diese Funktion:

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

Es funktioniert nur, wenn ich ersetzen es mit einem anderen Charakter. Es wird es nicht einfach entfernen.

Irgendwelche Gedanken?

+0

ersetzt Was ist das Muster? Möchten Sie das erste Zeichen nach dem Schrägstrich entfernen? –

+0

Ersetze "r2002" durch "2002" –

+0

Ersetzt string.replaceAt ('r') die erste Instanz von 'r' in der Zeichenkette? – Kailas

Antwort

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

char.length ist Null. Sie müssen 1 in diesem Fall hinzufügen, um Zeichen zu überspringen.

+0

Dies beantwortet die gestellte Frage nicht; Es erklärt einfach, warum 'replaceAt' nicht funktioniert. Es sollte ein Kommentar zu der ursprünglichen Frage statt einer Antwort sein. :) –

+0

@KenWhite, in der Tat beantwortet es die einzige Frage Frage, 'Irgendwelche Gedanken?'. –

+1

Soweit ich weiß, gibt es keinen Unterschied zwischen einem String und Char in JS .. – paislee

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

ersetzt /r mit /String.prototype.replace verwenden.

Alternativ können Sie regex (mit einer globalen Flagge (wie von Erik Reppen & Sagar Gala vorgeschlagen, unten)) verwenden, um alle Vorkommen zu ersetzen mit

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

Oh ja, duh. Vielen Dank! Viele gute Antworten hier, und viele werden funktionieren. Dies ist das einfachste für das, was ich brauche. – user1293504

+3

@ user1293504, wenn dies Ihre Frage beantwortet, sollten Sie es akzeptieren. Dadurch wissen andere, dass Ihr Problem gelöst wurde.Für Informationen zum Akzeptieren lesen Sie die [FAQ] (http://stackoverflow.com/faq), und für Informationen darüber, warum Sie dies tun sollten, lesen Sie diesen [meta post] (http://meta.stackexchange.com/questions/ 5234/how-do-Annahme-einer-Antwort-Arbeit). Vielen Dank. :) –

+1

Ich weiß es nicht. Ich bin einfach vorbeigekommen, um zu sehen, welche Antwort schließlich angenommen wurde, und bemerkte, dass keine gewesen war; dann sah ich den Kommentar zu dieser Antwort von der OP und dachte, ich würde eine Erinnerung fallen lassen, um sie zu akzeptieren. (Während ich hier war, habe ich auch up-votiert; während meine Antwort funktioniert, beantwortet Ihre Antwort direkt die Frage.) –

38

Es gibt immer die String-Funktionen, wenn Sie wissen, sind immer geht die vierte Stelle zu entfernen:

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

Wenn es immer das vierte Zeichen in Yourstring können Sie versuchen:

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

Es funktioniert nur, wenn ich es durch ein anderes Zeichen ersetze. Es wird es nicht einfach entfernen.

Dies liegt daran, wenn char zu "" gleich ist, char.length 0, so kombinieren Sie Ihren Teil die ursprüngliche Zeichenfolge zu bilden. Möchten Sie mit Ihrem Code versucht, wird folgende Arbeiten:

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

Ihre replaceAt fix einfach:

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

mystring.replaceAt(4, 1); 

ich es removeAt stattdessen nennen würde. :)

21

Ihre erste Funktion ist fast richtig.Entfernen Sie einfach das 'g' Flag, das für 'global' steht (edit) und geben Sie einen Kontext, um das zweite 'r' zu erkennen.

Edit: habe nicht gesehen, es war das zweite 'r' vor so hinzugefügt, '/'. Needs \/um das '/' zu vermeiden, wenn ein regEx-Argument verwendet wird. Vielen Dank für das upvotes aber ich war falsch, so werde ich fix und mehr Details für die Menschen zu verstehen, die Grundlagen der REGEX besser interessiert hinzufügen, aber dies funktionieren würde:

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

Jetzt für die übermäßige Erklärung:

Beim Lesen/denk, einen RegexMuster Schreiben in Bezug auf: ein Merkmal oder eine Gruppe von charcters > gefolgt von < ein Zeichen oder eine Reihe von charcters gefolgt > < von < ...

in REGEX < ein Zeichen oder eine Reihe von charcters > einer nach dem anderen sein könnte:

/each char in this pattern/ 

So wie e lesen, gefolgt von einem, gefolgt von c, etc ...

oder ein einzelnes < ein Zeichen oder Satz von charcters > könnte Zeichen von einer Zeichenklasse beschrieben werden:

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

oder erweitert auf eine Menge von Zeichen übereinstimmen (aber immer noch am besten von in Bezug auf die sequentielle prasseln als ein einzelnes Element zu denken 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) 

smoosh So ein Bündel zusammen:

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"] 

Und natürlich habe ich über erarbeitet aber mein Punkt war einfach, dass dies:

/cat/ 

eine Serie ist von 3 Musterelementen (ein Ding, gefolgt von einem Ding, gefolgt von einem Ding).

Und so ist dies:

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

Wie verrückt wie REGEX zu suchen beginnt, es bricht alles auf Reihe von Dingen (möglicherweise mit mehreren Zeichen Dinge) nach einander der Reihe nach. Irgendwie ein grundlegender Punkt, aber einer, der mich eine Weile gedauert hat, um vorbei zu kommen, also bin ich über Bord gegangen, um es hier zu erklären, da ich denke, es ist einer, der dem OP und anderen Neulingen helfen würde, zu verstehen, was vor sich geht. Der Schlüssel zum Lesen/Schreiben von RegEx besteht darin, es in diese Teile zu zerlegen.

6

Für den globalen Ersatz von '/ r' funktionierte dieser Code für mich.

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

Ich möchte nicht ersetzen Funktion verwenden, um Zeichen aus Zeichenfolge zu entfernen. Das ist nicht logisch, es so zu tun. Normalerweise programmiere ich in C# (Sharp), und wann immer ich Zeichen aus der Zeichenfolge entfernen möchte, verwende ich die Remove-Methode der String-Klasse, aber keine Replace-Methode, obwohl sie existiert, denn wenn ich gerade entferne, entferne ich nicht ersetzen. Das ist logisch!

In Javascript gibt es keine remove-Funktion für Zeichenfolge, aber es gibt substr-Funktion. Sie können die Funktion substr ein- oder zweimal verwenden, um Zeichen aus der Zeichenfolge zu entfernen. Sie können die folgende Funktion machen Zeichen am Startindex bis zum Ende der Zeichenfolge zu entfernen, wie nur die C# Methode zuerst String.Remove Überlastung (int start):

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

und/oder Sie können auch die folgende Funktion machen Zeichen am Startindex und zählen, wie die C# Methode zweite String.Remove Überlastung (int start, int count) zu entfernen:

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

und dann können Sie diese beiden Funktionen oder einer von ihnen für Ihre Bedürfnisse nutzen!

Beispiel:

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

Ausgang: crt/2002_2

Ziele zu erreichen, durch Techniken mit keine Logik tun könnten Verwirrungen in Verständnis des Codes verursachen und zukünftige Fehler, wenn Sie tun dies viel in einem großen Projekt!

+2

Ich würde sagen, dass die Einführung irrelevanter Methoden viel verwirrender ist als die Verwendung von 'String.prototype.replace', das Teil der Basis-API ist. Darüber hinaus ist das Verständnis des Entfernens als ein spezieller Ersatzfall ziemlich logisch, was das Programmieren angeht. Sie sollten nicht versuchen, dass Ihre API alle Wörter im englischen Wörterbuch enthält, Sie sollten versuchen, Ihre API auf ihre minimale orthogonale Basis zu reduzieren. – Witiko

1

In C# (Sharp) können Sie ein leeres Zeichen als '\ 0' eingeben. Vielleicht können Sie dies tun:

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

Suche auf Google oder surfen auf dem Interent und prüfen, ob Javascript ermöglicht es Ihnen, leere Zeichen zu machen, wie C# tut. Wenn ja, dann lerne, wie es geht, und vielleicht funktioniert die replaceAt-Funktion endlich, und du wirst erreichen, was du willst!

Schließlich wird das Zeichen 'r' entfernt!

36

Ein einfacher funktionaler würde Javascript Weg

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

einfach, schnell sein, es global und keine Notwendigkeit für Funktionen oder Prototypen

+1

Es funktioniert gut für mich. Während ich versuche, mystring = mystring.replace ('/ r', '/'); es konvertiert nur den ersten Korrektor, der Rest ist wie er ist. –

+0

Ich denke, es ist die beste Lösung, sehr einfach und Sie müssen nicht Regex dafür kennen! –

Verwandte Themen