Wie kann ich mit Javascript ein Zeichen aus einer Zeichenfolge entfernen?


362

Ich bin so nah dran, aber es ist einfach nicht richtig. Ich möchte nur das Zeichen raus einer Zeichenfolge entfernen . Das Problem ist, dass es mehr als eine Instanz von gibtr die Zeichenfolge . Es ist jedoch immer das Zeichen bei Index 4 (also das 5. Zeichen).

Beispielzeichenfolge: crt/r2002_2

Was ich möchte: crt/2002_2

Diese Ersetzungsfunktion entfernt beide 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 es nicht einfach entfernen.

Irgendwelche Gedanken?


Was ist das Problem hier, die "r" -s wurden alle entfernt, nicht wahr?
Vladimir Despotovic

Antworten:


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

ersetzen wird /rmit /Verwendung String.prototype.replace.

Alternativ können Sie Regex mit einem globalen Flag verwenden (wie von Erik Reppen & Sagar Gala unten vorgeschlagen), um alle Vorkommen durch zu ersetzen

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

BEARBEITEN: Da alle hier so viel Spaß haben und user1293504 nicht bald zurück zu kommen scheint, um klärende Fragen zu beantworten, ist hier eine Methode, um das N-te Zeichen aus einer Zeichenfolge 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 Anzahl anstelle einer nullindizierten Anzahl verwendet hat, müssen wir 1 aus dem Index entfernen. Wenn Sie dies verwenden möchten, um zu replizieren, wie charAtfunktioniert, subtrahieren Sie nicht 1 vom Index in der 3. Zeile und verwenden Sie tmp.splice(i, 1)stattdessen.


3
Das vierte Zeichen ist nicht unbedingt a"/"
jak.b

74

Ein einfacher funktionaler Javascript-Weg wäre

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

Einfach, schnell, global zu ersetzen und ohne Funktionen oder Prototypen


3
Es funktioniert großartig für mich. Während ich versuche, mystring = mystring.replace ('/ r', '/'); es konvertiert nur den ersten Korrektor, der Rest von ihnen ist so wie er ist.
rb vishnu

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

2
Das vierte Zeichen ist nicht unbedingt a'/'
jak.b

1
Laut Tests ( stackoverflow.com/questions/50463850/… ) ist der Leistungsunterschied kein Problem oder "hoher Preis zu zahlen", es sei denn, Sie schreiben ein Javascript mit hoher Leistung (10.000 Operationen pro Sekunde), sodass ich nicht sehe, wie genau Ihr Kommentar ist zur Lösung
beitragen

Abgesehen davon, dass es ineffizient ist (und eine Funktion wie diese iterativ auf langen Listen verwendet werden kann, wo es darauf ankommt), beantwortet dies nicht die Frage des OP, die vom Index abhängt, nicht vom vorhergehenden Zeichen.
aamarks

49

Es gibt immer die Zeichenfolgenfunktionen, wenn Sie wissen, dass Sie immer das vierte Zeichen entfernen werden:

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

Dies funktioniert nicht beim Entfernen des ersten oder letzten Zeichens
TekTimmy

3
@TekTimmy Warum nicht? str.slice(0, 0) + str.slice(1, str.length)Entfernt den ersten und str.slice(0, str.length-1) + str.slice(str.length, str.length)den letzten. (Natürlich würden Sie die redundanten Teile entfernen, wenn Sie wissen, dass Sie immer die ersten oder letzten entfernen, aber wenn es sich um Variablen handelt, funktionieren sie genauso gut wie jeder andere Index.)
JJJ

30

Deine erste Funk ist fast richtig. Entfernen Sie einfach das 'g'-Flag, das für' global 'steht (bearbeiten), und geben Sie ihm einen Kontext, um das zweite' r 'zu erkennen.

Bearbeiten: Ich habe nicht gesehen, dass es das zweite 'r' war, also habe ich das '/' hinzugefügt. Benötigt \ /, um das '/' zu umgehen, wenn ein regEx-Argument verwendet wird. Vielen Dank für die Upvotes, aber ich habe mich geirrt, also werde ich mehr Details für Leute korrigieren und hinzufügen, die daran interessiert sind, die Grundlagen von regEx besser zu verstehen, aber das würde funktionieren:

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

Nun zur übermäßigen Erklärung:

Denken Sie beim Lesen / Schreiben eines regEx-Musters an: <a Zeichen oder Zeichensatz> gefolgt von <a Zeichen oder Zeichensatz> gefolgt von <...

In regEx kann <a Zeichen oder Zeichensatz> einzeln sein:

/each char in this pattern/

Lesen Sie also als e, gefolgt von a, gefolgt von c usw.

Oder ein einzelnes <a Zeichen oder ein Satz von Zeichen> können Zeichen sein, die 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, um einer Anzahl von Zeichen zu entsprechen (aber 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 mach ein paar 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 zu viel ausgearbeitet, aber mein Punkt war einfach, dass dies:

/cat/

ist eine Reihe von 3 Musterelementen (eine Sache, gefolgt von einer Sache, gefolgt von einer Sache).

Und so ist das:

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

So verrückt regEx auch aussieht, es zerfällt alles in eine Reihe von Dingen (möglicherweise Dinge mit mehreren Zeichen), die nacheinander aufeinander folgen. Ein grundlegender Punkt, aber einer, für den ich eine Weile gebraucht habe, um vorbei zu kommen. Ich bin über Bord gegangen und habe ihn hier erklärt, da ich denke, dass er dem OP und anderen RegEx-Neulingen helfen würde, zu verstehen, was los ist. Der Schlüssel zum Lesen / Schreiben von regEx besteht darin, es in diese Teile zu zerlegen.


13

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

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

8

Repariere einfach deine replaceAt:

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

mystring.replaceAt(4, 1);

Ich würde es removeAtstattdessen nennen. :) :)


1
Dies löst tatsächlich das Problem des OP und erhält kaum Stimmen, während die beiden Top-Antworten die ursprüngliche Frage nicht lösen!
aamarks

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

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


Dies beantwortet die gestellte Frage nicht. es erklärt einfach, warum replaceAtes nicht funktioniert. Es sollte ein Kommentar zur ursprünglichen Frage anstelle einer Antwort sein. :)
Ken White

@ KenWhite, infact es beantwortet die einzige Frage stellen , Any thoughts?.
Ash Burlaczenko

Meinetwegen. Ich stimme nicht zu, aber ... :) Ich habe nicht abgelehnt, aber ich denke nicht, dass dies eine Antwort ist. Eine Antwort würde eine Lösung für das Problem bieten oder zumindest detaillierter erklären und eine Idee zur Behebung des Problems bieten.
Ken White

@ KenWhite, ich stimme zu, ich habe nur darauf hingewiesen, dass das OP seine Frage klarer machen könnte? Einige Leute wollen nur in eine Richtung zeigen, anstatt nur die Antwort zu geben.
Ash Burlaczenko

1
+1 für @paislee - diese Antwort ist nicht hilfreich, da es in JavaScript kein Zeichen gibt.
Simpleigh

2

Wenn es immer das 4. Zeichen in Ihrem String ist, 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 chargleich "", char.length0, so dass Ihr Teil kombinieren , um die ursprüngliche Zeichenfolge zu bilden. Bei Ihrem Codeversuch funktioniert Folgendes:

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 ^
}

2

Erstellen Sie eine Funktion wie unten

  String.prototype.replaceAt = function (index, char) {
      if(char=='') {
          return this.slice(0,index)+this.substr(index+1 + char.length);
      } else {
          return this.substr(0, index) + char + this.substr(index + char.length);
      }
  }

Zum Ersetzen geben Sie Zeichen wie unten

  var a="12346";
  a.replaceAt(4,'5');

Geben Sie hier die Bildbeschreibung ein

Um das Zeichen am bestimmten Index zu entfernen, geben Sie den zweiten Parameter als leere Zeichenfolge an

a.replaceAt(4,'');

Geben Sie hier die Bildbeschreibung ein


2

Wenn Sie nur ein einzelnes Zeichen entfernen möchten und den Index eines Zeichens kennen, das Sie entfernen möchten, können Sie die folgende Funktion verwenden:

/**
 * Remove single character at particular index from string
 * @param {*} index index of character you want to remove
 * @param {*} str string from which character should be removed
 */
function removeCharAtIndex(index, str) {
    var maxIndex=index==0?0:index;
    return str.substring(0, maxIndex) + str.substring(index, str.length)
}

Dies funktioniert in einigen Fällen nicht (z. B. Index = 0).
Tomer

1

Ich mag es nicht, die Ersetzungsfunktion zu verwenden, um Zeichen aus der Zeichenfolge zu entfernen. Das ist nicht logisch , um es so zu machen. Normalerweise programmiere ich in C # (scharf), 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 vorhanden ist, denn wenn ich sie entfernen möchte, entferne ich kein ersetzen. Das ist logisch!

In Javascript gibt es keine Entfernungsfunktion für Zeichenfolgen, aber eine Substr-Funktion. Sie können die substr-Funktion ein- oder zweimal verwenden, um Zeichen aus der Zeichenfolge zu entfernen. Sie können die folgende Funktion ausführen, um Zeichen am Startindex bis zum Ende der Zeichenfolge zu entfernen, genau wie die c # -Methode zuerst String.Remove (int startIndex) überlädt:

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

und / oder Sie können auch die folgende Funktion ausführen, um Zeichen beim Startindex zu entfernen und zu zählen, genau wie bei der zweiten Überladung der c # -Methode String.Remove (int startIndex, int count):

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

und dann können Sie diese beiden Funktionen oder eine davon für Ihre Bedürfnisse verwenden!

Beispiel:

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

Ausgabe: crt / 2002_2

Das Erreichen von Zielen durch Techniken ohne Logik kann zu Verwirrung beim Verständnis des Codes und zu zukünftigen Fehlern führen, wenn Sie dies in einem großen Projekt häufig tun!


2
Ich würde sagen, dass die Einführung von Fremdmethoden viel verwirrender ist als die bloße Verwendung String.prototype.replace, die Teil der Basis-API ist. Darüber hinaus ist es in Bezug auf die Programmierung ziemlich logisch, das Entfernen als Sonderfall des Ersetzens zu verstehen. Sie sollten nicht versuchen, Ihre API so zu gestalten, dass sie alle Wörter im englischen Wörterbuch enthält. Sie sollten versuchen, Ihre API auf die minimale orthogonale Basis zu reduzieren.
Witiko

1

Die folgende Funktion hat in meinem Fall am besten funktioniert:

public static cut(value: string, cutStart: number, cutEnd: number): string {
    return value.substring(0, cutStart) + value.substring(cutEnd + 1, value.length);
}

1

Der kürzeste Weg wäre die Verwendung von Spleiß

var inputString = "abc";
// convert to array and remove 1 element at position 4 and save directly to the array itself
let result = inputString.split("").splice(3, 1).join();
console.log(result);

Splice mutiert das ursprüngliche Array und gibt nur die betroffenen Elemente zurück. Da Arrays mit Null indiziert sind, gibt dieses Beispiel "" zurück (da das dritte Element im Array das Leerzeichen zwischen dem cund dem ist ")
JKirchartz

1

Sie können dies verwenden: if ( str[4] === 'r' ) str = str.slice(0, 4) + str.slice(5)

Erläuterung:

  1. if ( str[4] === 'r' )
    Überprüfen Sie, ob das 5. Zeichen a ist 'r'

  2. str.slice(0, 4)
    Schneiden Sie die Schnur, um alles vor dem zu bekommen 'r'

  3. + str.slice(5)
    Fügen Sie den Rest der Zeichenfolge hinzu.

Minimiert: s=s[4]=='r'?s.slice(0,4)+s.slice(5):s [37 Bytes!]

DEMO:

function remove5thR (s) {
  s=s[4]=='r'?s.slice(0,4)+s.slice(5):s;
  console.log(s); // log output
}

remove5thR('crt/r2002_2')  // > 'crt/2002_2'
remove5thR('crt|r2002_2')  // > 'crt|2002_2'
remove5thR('rrrrr')        // > 'rrrr'
remove5thR('RRRRR')        // > 'RRRRR' (no change)


1
let str = '1234567';
let index = 3;
str = str.substring(0, index) + str.substring(index + 1);
console.log(str) // 123567 - number "4" under index "3" is removed


-1

In C # (scharf) können Sie ein leeres Zeichen als '\ 0' erstellen. Vielleicht kannst du das machen:

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

Suchen Sie auf Google oder surfen Sie im Interent und prüfen Sie, ob Sie mit Javascript leere Zeichen erstellen können, wie dies bei C # der Fall ist. Wenn ja, dann lernen Sie, wie es geht, und vielleicht funktioniert die Funktion replaceAt endlich, und Sie werden erreichen, was Sie wollen!

Schließlich wird dieses 'r'-Zeichen entfernt!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.