Ich kann das benutzen:
String str = "TextX Xto modifyX";
str = str.replace('X','');//that does not work because there is no such character ''
Gibt es eine Möglichkeit, alle Vorkommen von Zeichen X
aus einem String in Java zu entfernen ?
Ich habe es versucht und ist nicht das, was ich will: str.replace('X',' '); //replace with space
Antworten:
Versuchen Sie, die Überladung zu verwenden, die
CharSequence
Argumente (z. B.String
) akzeptiert , anstattchar
:quelle
CharSequence
. docs.oracle.com/javase/7/docs/api/java/lang/…X
Typ char ist?toString
es zuerst brauchen . Ihr Code würde alsostr = str.replace(yourChar.toString(), "");
str = str.replace("\uffff", "");
Verwenden von
wird funktionieren.
Verwendung wäre
str.replace("X", "");
.Ausführen
kehrt zurück:
quelle
replace
Überlastung, die einfach istCharSequence
.Wenn Sie etwas mit Java Strings tun möchten, ist Commons Lang StringUtils ein großartiger Ort, um nachzuschauen .
quelle
replace
.Dies ist das Beispiel, in dem ich das Zeichen aus dem String entfernt habe.
quelle
Ich benutze RegEx bei dieser Gelegenheit gerne:
Dabei bedeutet g global, sodass es Ihre gesamte Zeichenfolge durchläuft und alle X durch '' ersetzt. Wenn Sie sowohl X als auch x ersetzen möchten, sagen Sie einfach:
(siehe meine Geige hier: Geige )
quelle
Hallo Versuchen Sie diesen Code unten
quelle
Verwenden Sie replaceAll anstelle von replace
Dies sollte Ihnen die gewünschte Antwort geben.
quelle
return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
quelle
input = "deletes all blanks too";
gibt "deletesalllankstoo"Hier ist eine Lambda-Funktion, die alle als Zeichenfolge übergebenen Zeichen entfernt
String str = "TextX XYto modifyZ";
deleteChars.apply( str, "XYZ" ); // –> "Text to modify"
Diese Lösung berücksichtigt, dass die resultierende Zeichenfolge - im Unterschied zu
replace()
- beim Entfernen von Zeichen niemals größer als die Startzeichenfolge wird. So ist es die wiederholte Aufteilung und Kopieren während das Anhängen Charakter weise auf die vermeidet ,StringBuilder
wie derreplace()
Fall ist.Ganz zu schweigen von der sinnlosen Generierung von
Pattern
undMatcher
Instanzenreplace()
, die zum Entfernen niemals benötigt werden.Im Gegensatz zu
replace()
dieser Lösung können mehrere Zeichen auf einen Schlag gelöscht werden.quelle
str.replace("…", "")
instanziiertprivate Pattern(…)
und dann auf die generierten Musteraufrufepublic String replaceAll(String repl)
. Also passierten folgende Funktionsaufrufe:return Pattern.compile(target.toString(), Pattern.LITERAL).matcher( this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
- siehe Kommentar Sal_Vader_808. Alles in allem ca. 3 mal länger als meine Hüft- Lambda-Lösung. Und hier wird gut erklärt, warum meine Hüft- Lambda-Lösung auch schneller ist: Warum ist Javas String :: replace () so langsam?Auswertung der Hauptantworten mit einem Leistungsbenchmark, der Bedenken bestätigt, dass die aktuell gewählte Antwort kostspielige Regex-Operationen unter der Haube macht
Bisher gibt es die drei Antworten in drei Hauptstilen (ohne Berücksichtigung der JavaScript-Antwort;)):
In Bezug auf die Codegröße ist der String.replace eindeutig der knappste. Die einfache Java-Implementierung ist etwas kleiner und sauberer (IMHO) als die Lambda (verstehen Sie mich nicht falsch - ich verwende Lambdas oft dort, wo sie angemessen sind).
Die Ausführungsgeschwindigkeit war in der Reihenfolge der schnellsten bis langsamsten: einfache Java-Implementierung, Lambda und dann String.replace () (der Regex aufruft).
Die mit Abstand schnellste Implementierung war die einfache Java-Implementierung, die so abgestimmt wurde, dass sie den StringBuilder-Puffer auf die maximal mögliche Ergebnislänge vorbelegt und dann einfach Zeichen an den Puffer anfügt, die nicht in der Zeichenfolge "Zeichen zum Löschen" enthalten sind. Dadurch werden Neuzuweisungen vermieden, die für Zeichenfolgen mit einer Länge von> 16 Zeichen auftreten würden (die Standardzuweisung für StringBuilder), und es wird vermieden, dass beim Löschen von Zeichen aus einer Kopie der Zeichenfolge, die auftritt, die Lambda-Implementierung auftritt.
Der folgende Code führt einen einfachen Benchmark-Test durch, bei dem jede Implementierung 1.000.000 Mal ausgeführt und die verstrichene Zeit protokolliert wird.
Die genauen Ergebnisse variieren mit jedem Lauf, aber die Reihenfolge der Leistung ändert sich nie:
Die Lambda-Implementierung (wie aus Kaplans Antwort kopiert) ist möglicherweise langsamer, da sie eine "Verschiebung um eins um eins" aller Zeichen nach rechts von dem zu löschenden Zeichen ausführt. Dies würde sich offensichtlich bei längeren Zeichenfolgen mit vielen zu löschenden Zeichen verschlechtern. Außerdem kann die Lambda-Implementierung selbst einen gewissen Overhead verursachen.
Die String.replace-Implementierung verwendet Regex und führt bei jedem Aufruf eine Regex-Kompilierung durch. Eine Optimierung hierfür wäre, Regex direkt zu verwenden und das kompilierte Muster zwischenzuspeichern, um die Kosten für die Kompilierung jedes Mal zu vermeiden.
quelle
fromString.replace("X", "").replace("Y", "").replace("Z", "");
benötigt würde. Jetzt bekommen wir das richtige Timing: Einfach starten Zeit: 759 | Start Lambda Zeit: 1092 | Starten Sie deleteCharsLambda (). Zeit: 1420 | Start ersetzen korrigiert Zeit: 4636Sie müssen die Zeichen, die während des Austauschs entfernt werden müssen, in die eckigen Klammern setzen. Der Beispielcode lautet wie folgt:
quelle
Sie können
str = str.replace("X", "");
wie oben erwähnt verwenden und es wird Ihnen gut gehen. Zu Ihrer Information''
ist kein leeres (oder gültiges) Zeichen sondern'\0'
.Sie könnten also
str = str.replace('X', '\0');
stattdessen verwenden.quelle