529 Stimmen

Wie kann ich mit JavaScript ein Zeichen aus einer Zeichenkette entfernen?

Ich bin so kurz davor, es zu bekommen, aber es ist einfach nicht richtig. Alles, was ich tun möchte, ist, das Zeichen zu entfernen r aus einer Zeichenkette. Das Problem ist, es gibt mehr als eine Instanz von r in der Zeichenkette. Es ist jedoch immer das Zeichen bei Index 4 (also das 5. Zeichen).

Beispiel-String: crt/r2002_2

Was ich will: crt/2002_2

Diese Ersetzungsfunktion beseitigt sowohl r

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

Produziert: ct/2002_2

Ich habe diese Funktion ausprobiert:

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 es durch ein anderes Zeichen ersetze. Es wird nicht einfach entfernt.

Haben Sie eine Idee?

659voto

JKirchartz Punkte 16803
var mystring = "crt/r2002_2";
mystring = mystring.replace('/r','/');

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

Alternativ können Sie auch regex mit einem globalen Flag verwenden (wie von Erik Reppen & Sagar Gala (siehe unten), um alle Vorkommen durch

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

EDIT: Da alle hier so viel Spaß haben und Benutzer1293504 in nächster Zeit nicht zurückzukommen scheint, um klärende Fragen zu beantworten, hier eine Methode, um das N-te Zeichen aus einer Zeichenkette zu entfernen:

String.prototype.removeCharAt = function (i) {
    var tmp = this.split(''); // convert to an array
    tmp.splice(i - 1 , 1); // remove 1 element from the array (adjusting for non-zero-indexed counts)
    return tmp.join(''); // reconstruct the string
}

console.log("crt/r2002_2".removeCharAt(4));

Da user1293504 die normale Zählung anstelle einer Null-indizierten Zählung verwendet hat, müssen wir 1 aus dem Index entfernen, wenn Sie dies verwenden möchten, um zu replizieren, wie charAt Werke subtrahieren nicht 1 vom Index in der 3. Zeile und verwenden tmp.splice(i, 1) stattdessen.

104voto

Strife86 Punkte 1095

Ein einfacher funktionaler Weg mit Javascript wäre

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

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

78voto

simpleigh Punkte 2684

Es gibt immer noch die String-Funktionen, wenn Sie wissen, dass Sie immer das vierte Zeichen entfernen werden:

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

34voto

Erik Reppen Punkte 4527

Ihr erster Funkspruch ist fast richtig. Entfernen Sie einfach das "g"-Flag, das für "global" (bearbeiten) steht, und geben Sie ihm etwas Kontext, um das zweite "r" zu erkennen.

Edit: Ich habe nicht gesehen, dass es das zweite 'r' war, also habe ich das '/' hinzugefügt. Benötigt \/, um das '/' zu entkommen, wenn ein regEx arg verwendet wird. Vielen Dank für die upvotes, aber ich war falsch, so dass ich zu beheben und fügen Sie mehr Details für Menschen, die in die Grundlagen der regEx besser zu verstehen, aber das würde funktionieren:

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

Und nun die übertriebene Erklärung:

Wenn Sie ein regEx-Muster lesen/schreiben, denken Sie an Folgendes: <ein Zeichen oder eine Reihe von Zeichen>, gefolgt von <einem Zeichen oder einer Reihe von Zeichen>, gefolgt von <...

In regEx kann <ein Zeichen oder eine Menge von Zeichen> jeweils ein Zeichen sein:

/each char in this pattern/

Also lesen als e, gefolgt von a, gefolgt von c, usw...

Oder ein einzelnes <aZeichen oder eine Menge von Zeichen> könnten Zeichen sein, die durch eine 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, um mit einer Menge von Zeichen übereinzustimmen (aber immer noch am besten als ein einzelnes Element in Bezug auf das sequentielle Muster zu betrachten):

/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)

Also zerknüllen Sie einen Haufen davon:

   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 zu sehr ins Detail gegangen, aber ich wollte damit nur sagen, dass dies:

/cat/

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

Das gilt auch für das hier:

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

So verrückt regEx auch aussehen mag, es besteht aus einer Reihe von Dingen (die möglicherweise aus mehreren Zeichen bestehen), die nacheinander folgen. Das ist ein grundlegender Punkt, aber es hat eine Weile gedauert, bis ich ihn verstanden habe, deshalb habe ich ihn hier ausführlich erklärt, da ich denke, dass er dem OP und anderen, die neu in regEx sind, helfen würde, zu verstehen, was vor sich geht. Der Schlüssel zum Lesen/Schreiben von regEx ist, es in diese Teile zu zerlegen.

19voto

Ken White Punkte 120217

Reparieren Sie einfach Ihre replaceAt :

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

mystring.replaceAt(4, 1);

Ich würde es so nennen removeAt statt. :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X