HOWTO · Java

Mehrere Zeichen in einem Java-String ersetzen

Dieser Artikel zeigt, wie Sie mit replaceAll(), replace() und replaceFirst() mehrere Zeichen in einem Java-String ersetzen.

Auf dieser Seite

Mit String.replaceAll() und einer regulären Ausdruckszeichenklasse können Sie in Java mehrere ausgewählte Zeichen überall in einem String ersetzen. Für feste Zeichenfolgen ohne Muster können Sie Aufrufe von String.replace() verketten. String.replaceFirst() ändert nur den ersten Treffer eines regulären Ausdrucks.

Ersetzen mehrerer Zeichen in einer Zeichenkette mit replaceAll() in Java

String.replaceAll(regex, replacement) behandelt das erste Argument als regulären Ausdruck und ersetzt jeden Treffer. Eine Zeichenklasse wie [_/] findet jeweils einen Unterstrich oder einen Schrägstrich. Sie findet nicht die zweistellige Folge _/ als Einheit.

Das folgende vollständige Programm ersetzt Unterstriche und Schrägstriche durch Bindestriche und gibt beide Strings aus:

public class ReplaceAllChars {
  public static void main(String[] args) {
    String input = "j_u_s_t/a/s/t/r/i/n/g";
    String result = input.replaceAll("[_/]", "-");
    System.out.println("Input: " + input);
    System.out.println("Result: " + result);
  }
}
Input: j_u_s_t/a/s/t/r/i/n/g
Result: j-u-s-t-a-s-t-r-i-n-g

Ein Backslash für den regulären Ausdruck muss auch im Java-Stringliteral maskiert werden. Beispielsweise übergibt "\\d" den regulären Ausdruck \d, der eine Ziffer findet. Wenn Sie einen Treffer durch "" ersetzen, wird er entfernt. So entfernt "abcd12345efgh".replaceAll("\\d", "") Ziffern; "s t r i n g".replaceAll(" ", "") entfernt gewöhnliche Leerzeichen; und "s t\\tr".replaceAll("\\s", "-") ersetzt Whitespace-Zeichen des regulären Ausdrucks, einschließlich Leerzeichen und Tabulatoren, durch Bindestriche.

Diese Ausdrücke entfernen Ziffern, entfernen gewöhnliche Leerzeichen und ersetzen Whitespace-Zeichen (einschließlich Leerzeichen und Tabulatoren) durch Bindestriche. Um gezielt kleingeschriebene ASCII-Buchstaben zu entfernen, verwenden Sie [a-z]. Java behandelt \\p{Lower} standardmäßig als ASCII-Klasse; Unicode-Kleinbuchstaben sind darin nur enthalten, wenn das Verhalten für Unicode-Zeichenklassen aktiviert ist.

Ersetzen mehrerer Zeichen in einer Zeichenkette mit String.replace() in Java

String.replace(target, replacement) sucht nach einer wörtlichen Zeichenfolge und interpretiert sie nicht als regulären Ausdruck. Jeder Aufruf ersetzt alle Vorkommen des Suchtexts und gibt einen neuen String zurück, denn Java-Strings sind unveränderlich. Eine Verkettung eignet sich, wenn mehrere Suchtexte jeweils einer eigenen Ersetzung zugeordnet werden. Die Aufrufe werden von links nach rechts ausgeführt: Ein früherer Aufruf kann also Text erzeugen, den ein späterer Aufruf dann findet.

Ausgehend von "javbjavcjadakavajavc" ergibt die Aufrufkette input.replace("b", "a").replace("c", "a").replace("d", "v").replace("k", "j") den String javajavajavajavajava. Verwenden Sie replace(), wenn die Suchtexte wörtlich gemeint sind und einzelne Aufrufe die Zuordnungen am klarsten ausdrücken. Mit replaceAll() können Sie dagegen Zeichen, die einem gemeinsamen Regex-Muster entsprechen, zusammen ersetzen.

Ersetzen mehrerer Zeichen in einer Zeichenkette mit String.replaceFirst() in Java

Auch String.replaceFirst(regex, replacement) erwartet einen regulären Ausdruck, ersetzt pro Aufruf aber nur den ersten Treffer. Bei einem weiteren Aufruf wird die Suche auf dem String fortgesetzt, den der vorherige Aufruf zurückgegeben hat. Das ist nützlich, wenn Anzahl und Reihenfolge der Ersetzungen bewusst festgelegt werden sollen.

Zum Beispiel liefert "This is a sample string.".replaceFirst("i", "1").replaceFirst("s", "2") den String Th12 is a sample string.. Der erste Aufruf ersetzt das i in This; der zweite sucht anschließend im aktualisierten String und ersetzt das erste s, ebenfalls in This. Verwenden Sie replaceFirst() für Ersetzungen des jeweils ersten Treffers und replaceAll(), wenn alle Treffer geändert werden sollen.

Fazit

Für mehrere ausgewählte Zeichen ersetzt eine Regex-Zeichenklasse mit String.replaceAll() jeden Treffer. Mit verketteten String.replace()-Aufrufen ändern Sie wörtlich angegebene Zeichenfolgen; String.replaceFirst() ist passend, wenn jeder Aufruf nur den ersten Regex-Treffer ändern soll.