Gleichzeitiges ersetzen mehrerer Strings

werdas34

Bekanntes Mitglied
Hallo,
ich haben ein String text der alles sein kann. Filenamen, Filecontent etc.

Nun möchte ich mehrere Strings in diesem text ersetzen. Soweit kein Problem.
einfach text.replace("a", "b").replace("c","d");

Ich habe nur das Problem das ein Substring das ersetzt wird vom anderen wiederum erkannt wird und falsch ersetzt wrid. Kleines Beispiel.
Torte -> Kirschtorte
torte -> kirschtorte

Das führt dazu das aus Torte -> Kirschkirschtorte wird, da zuerst der text nach Torte sucht und durch Kirschtorte ersetzt und dann torte durch kirschtorte in Kirschtorte ersetzen möchte und dann Kirschkirschtorte daraus wird.

Ne Idee wäre das ich den text zeichenweise durchgehe und bei einem match den String austausche. Quasi sliding window.
Nur haben die Strings unterschiedliche Längen. Heißt wenn ein String 2 Zeichen lang ist und einer 5 dann muss ich ich alle möglichen Kombination aus 2er und 5er Substrings überprüfen müsste

Gib es einen Weg mehrere replace-Strings unterschiedlicher Länge zu ersetzen und dabei den text nur einmal zu durchlaufen, um sowas wie oben zu vermeiden? Oder eine optimierte Variante von sliding window?
 

KonradN

Super-Moderator
Mitarbeiter
Du hast generell mehrere Möglichkeiten:

a) manchmal hast Du die Möglichkeit, es über die Reihenfolge zu klären. Wenn Du also erst "torte" ersetzt und dann "Torte", dann reagiert das zweite Ersetzen nicht auf das Ersetzte vom ersten. Das ist also eine Art Sonderfall, bei dem Du keine Probleme hast.

b) Eine Idee ist, dass Du erst Dinge zu etwas ersetzt, die nicht vorkommen können. Du ersetzt also erst:
Torte -> ##1##
torte -> ##2##
Dann kannst Du
##1## -> Kirschtorte
##2## -> kirschtorte
ersetzen.
Damit hast zwar die doppelte Anzahl an Ersetzungen, aber es kommt nicht zu der Reaktion auf Elemente, die erst eingefügt wurden.

c) Wenn Du es als Code machst, dann kannst Du es natürlich selbst ersten. Dann gehst Du den String Zeichen für Zeichen durch und fügst das dann ein. Der Algorithmus könnte also etwas sein wie:
So lange pos < MaxIndex String
  • fängt an pos ein zu ersetzender String an? Dann füge an das Ergebnis das zu ersetzende an und pos wird um die Länge des zu ersetzenden Strings erhöht.
  • wenn nicht, dann füge das aktuelle Zeichen an das Ergebnis an und erhöhe pos um 1.

Damit hättest Du einen Algorithmus, der die Ersetzung macht ohne dass es zu doppelten Ersetzungen kommen kann.

Das wären 3 einfache Ideen, die das Problem lösen könnten und die mir so auf Anhieb direkt einfallen. Es gibt bestimmt noch deutlich mehr Möglichkeiten, aber ich hoffe, dass diese Ideen erst einmal reichen.
 

werdas34

Bekanntes Mitglied
Danke für deine Antwort.

a) hängt von der Reihenfolge der Wörter in text ab. Und das kann sehr unterschiedlich sein. Daher wird das nicht ausreichen.

b) Wäre ne interessante Idee, aber man müsste sehr viele Platzhalter verwenden bei vielen ähnlichen Substrings..

c) Ist der von mir angesprochene sliding window Ansatz. Meine Befürchtung ist das es recht lange dauern kann. Bei einem text von 1000 Zeichen und einem Substring der Länge 4, müsste ich wenn ich richtig liege 997 Vergleiche machen.
Könnte man das irgendwie optimieren?
 

KonradN

Super-Moderator
Mitarbeiter
Also A) geht so du eine Reihenfolge basteln kannst, dass alle Nachfolger nicht auf den Replacement Text eines Vorgängers reagiert.

Zu B) das ist nicht wirklich ein Problem. Wenn man sich das etwas überlegt. Es reicht ja, dass man in den Replacement Text zusätzliche Zeichen platziert, die nicht kommen können. Also z.B. \u0000. Damit würden Nachfolgende Replace nicht mehr ansprechen und am Ende entfernt man nur alle \u0000 …. So als kleine Variante.

Zu C) die genauen Anforderungen sind wichtig sowie die Länge der zu suchenden Texte. Wenn die Anzahl der Ersetzungen gering ist, dann hast du eine kleine Anzahl Anfangsbuchstaben und kannst vermutlich relativ zügig durch einen Text gehen mit wenig String Vergleichen.

Generell gilt aber auch: Bau es erst einmal möglichst einfach. Wenn es dann nicht performant genug ist, dann kannst du optimieren. Oder dir bessere Algorithmen überlegen.
 

Oneixee5

Top Contributor
Du kannst auch Satzzeichen mit einbeziehen. Also z.B.: Anfang der Datei/Zeile, Ende der Datei/Zeile, Lehrzeichen, Komma, Punkt, etc. Das hört sich erst mal kompliziert an, aber dafür gibt es Zeichengruppen.
Wenn du nach " torte" suchst, dann wird Kirschtorte nicht gefunden.
Ein Marker dafür wäre evtl.: \b
Java:
abc = abc.replaceAll("\\btorte\\b", "Kirschtorte");

boundary matchers:​

Boundary ConstructDescription
^The beginning of a line
$The end of a line
\bA word boundary
\BA non-word boundary
\AThe beginning of the input
\GThe end of the previous match
\ZThe end of the input but for the final terminator, if any
\zThe end of the input
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Wichtig ist, dass man hier halt die Anforderungen genau analysiert und ggf. spezifiziert. Bezüglich des Beispiels bedeutet dies: Was soll aus "Apfeltorte" werden? Soll das "Apfelkirschtorte"? Oder noch besser: Was ist, wenn es bereits eine "Kirschtorte" ist? Soll das eine Kirschkirschtorte werden?
Ebenso die Frage, was mit einem "Tortenheber" ist? Wird das ein "Kirschtortenheber"?

Da Torte ein Substantiv ist, deutet das Ersetzen von torte darauf hin, dass auch Wortbestandteile ersetzt werden soll.

Aber das ist ein wichtiger Punkt, wenn man so Ersetzungen mit regulären Ausdrücken machen möchte und je nach Anforderungen wird dies dann auch recht schwer umzusetzen.
 

httpdigest

Top Contributor
By the way: Wenn es hier nicht um die Interpretation von "Was ist eigentlich ein Wort?" bzw. "wie ersetze ich Wörter durch andere Wörter?" im Kontext von natürlichen Sprachen geht (wo @KonradN ja sehr richtig aufführt, dass es wie immer auf die korrekte Formulierung der Anforderungen ankommt), sondern wirklich einfach nur um das Ersetzen von beliebigen Substrings durch andere Substrings in einem längeren String mit Berücksichtigung von den im initialen Post angesprochenen möglichen Fehlern durch Ersetzungen der Ersetzungen, dann gibt es als sehr laufzeiteffiziente Lösung den Aho-Corasick Algorithmus.

Diese Seite beschreibt den sehr gut: https://cp-algorithms.com/string/aho_corasick.html

Dieser hat dann bei Gesamtlänge M aller Ersetzungen bei einem Gesamttext der Länge N nicht Laufzeitkomplexität O(N*M), sondern nur O(M+N+k), wobei 'k' hier die Anzahl der im Gesamttext tatsächlich gefundenen Vorkommen ist.
 

httpdigest

Top Contributor
Ein weiterer Fall, der aber auch hiermit schwierig wird, ist, wenn es zwei Ersetzungen A -> B und A' -> B' gibt, wobei A ein Präfix von A' ist.
Also z.B. "ab" -> "cd" und "abc" -> "xy".
Hier muss man dann auch entscheiden, was man haben möchte: z.B. "der längste Match gewinnt und nur dieser wird ersetzt".
Also der Text "abcd" wird dann zu "xyd" und nicht zu "cdcd".
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S gleichzeitiges Ansprechen vieler Textfelder Java Basics - Anfänger-Themen 2
C Ist gleichzeitiges Lesen und Schreiben einer ArrayList möglich Java Basics - Anfänger-Themen 2
G Gleichzeitiges Verarbeiten von Variablen 2er Obj. selber Kl. Java Basics - Anfänger-Themen 5
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
A 1 Leerzeichen durch zwei Leerzeichen ersetzen Java Basics - Anfänger-Themen 4
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
obiwanke Ziffern durch ASCII Character ersetzen Java Basics - Anfänger-Themen 8
C In String, Buchstaben ersetzen durch andere Buchstaben Java Basics - Anfänger-Themen 26
C if-Konstrukt durch switch-Konstrukt ersetzen Java Basics - Anfänger-Themen 14
W Best Practice Tabulatoren verschiedener Länge ersetzen Java Basics - Anfänger-Themen 8
I String ersetzen, der Inhalt enthält Java Basics - Anfänger-Themen 4
T Zahl in Array ersetzen Java Basics - Anfänger-Themen 2
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
N for Schleife durch Rekursion ersetzen Java Basics - Anfänger-Themen 6
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
V Erste Schritte Vokale im Satz ersetzen Java Basics - Anfänger-Themen 20
S Ersetzen eines Asterix in einem String Java Basics - Anfänger-Themen 8
ruutaiokwu Ausgegebene Zeile ersetzen mit neuem Text Java Basics - Anfänger-Themen 3
CptK Interface Curser durch Bild ersetzen & MouseListner Java Basics - Anfänger-Themen 2
S Wort suchen und ersetzen in einer Datei Java Basics - Anfänger-Themen 6
W Teilstring durch Teilstring mittels StringBuilder ersetzen Java Basics - Anfänger-Themen 7
J Kopierte Datei soll alte ersetzen. Java Basics - Anfänger-Themen 6
K BufferedReader für IOTools ersetzen? Java Basics - Anfänger-Themen 17
Jinnai4 Strings ersetzen Java Basics - Anfänger-Themen 9
G Wert in Textdatei ersetzen? Java Basics - Anfänger-Themen 2
C char in String suchen und durch anderen String ersetzen Java Basics - Anfänger-Themen 2
M 2 Stellen in einem Array vergleichen und bei übereinstimmen eine davon ersetzen Java Basics - Anfänger-Themen 1
F In LinkedList einen Wert ersetzen oder neu einfügen Java Basics - Anfänger-Themen 7
Alex/89 String in einer txt ersetzen Java Basics - Anfänger-Themen 15
B Greenscreen (grüner Hintergrund ersetzen mit Bild) Java Basics - Anfänger-Themen 49
E RTF/DOC(x) textteile ersetzen/verändern Java Basics - Anfänger-Themen 0
K ArrayList durch ArrayList ersetzen Java Basics - Anfänger-Themen 5
T Strings ersetzen mit \ Java Basics - Anfänger-Themen 10
A Suchen und ersetzen Java Basics - Anfänger-Themen 13
Lord.Djerun (Taschenrechner Netbeans) Komma nur einmal schreiben & 0 ersetzen Java Basics - Anfänger-Themen 1
A Text mit "Scanner" eingeben und Umlaute ersetzen Java Basics - Anfänger-Themen 7
hello_autumn Strings ersetzen... Java Basics - Anfänger-Themen 10
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
G Ersetzen eines confirm dialogs/ synchronisieren von methoden Java Basics - Anfänger-Themen 6
T Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen Java Basics - Anfänger-Themen 7
J Ersetzen Java Basics - Anfänger-Themen 4
Ananaskirsche Input/Output Platzhalter durch String in yml-Datein ersetzen Java Basics - Anfänger-Themen 5
AssELAss ß durch ss oder SS ersetzen Java Basics - Anfänger-Themen 10
J Input/Output String Suchen und Ersetzen Java Basics - Anfänger-Themen 8
M nach Typenkonvertierung Leerzeichen ersetzen Java Basics - Anfänger-Themen 2
G Line Separator in ArrayList durch ";" ersetzen Java Basics - Anfänger-Themen 4
L Wort in String ersetzen Java Basics - Anfänger-Themen 11
N Java Programm zum Suchen und Ersetzen von Text Dateien Java Basics - Anfänger-Themen 10
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
J Vokale ersetzen Java Basics - Anfänger-Themen 7
G GUI Label Werte ersetzen Java Basics - Anfänger-Themen 25
G String ersetzen Java Basics - Anfänger-Themen 5
G GUI JLabel ersetzen Java Basics - Anfänger-Themen 3
X String einzelne Buchstaben ersetzen Java Basics - Anfänger-Themen 4
C Variablen Variablen ersetzen Java Basics - Anfänger-Themen 7
Kenan89 Bestimmte Zeile in txt-Datei ersetzen Java Basics - Anfänger-Themen 4
D Slash durch zwei Backslash ersetzen Java Basics - Anfänger-Themen 11
S Button durch ImageIcon ersetzen Java Basics - Anfänger-Themen 9
C Elemente im StringBuffer ersetzen Java Basics - Anfänger-Themen 19
S im StringBuilder Zeichenketten ersetzen Java Basics - Anfänger-Themen 6
A String ersetzen Java Basics - Anfänger-Themen 6
B Char in String ersetzen Java Basics - Anfänger-Themen 15
J Alle Vorkommen eines chars in einem Array durch einen anderen char ersetzen Java Basics - Anfänger-Themen 10
I Ersetzen eines Objektes in einer Liste? Java Basics - Anfänger-Themen 5
A Datentypen Sonderzeichen / Strings ersetzen Java Basics - Anfänger-Themen 3
A Vokale im String ersetzen Java Basics - Anfänger-Themen 12
S Objekt durch Schnittstelle ersetzen Java Basics - Anfänger-Themen 2
F Substring mittels RegEx ermitteln/ersetzen? Java Basics - Anfänger-Themen 2
K Ersetzen von Teilstrings in ArrayList von Strings Java Basics - Anfänger-Themen 11
S Datentypen In mehreren Dateien Strings ersetzen Java Basics - Anfänger-Themen 14
A Doppelter Backslash durch einen einfachen Backslash ersetzen Java Basics - Anfänger-Themen 6
T Doppelte Anführungszeichen ersetzen?? Java Basics - Anfänger-Themen 4
B Vector in Table ersetzen Java Basics - Anfänger-Themen 4
J Große animierte Gif preloaden und solange mit einer nicht animierten ersetzen Java Basics - Anfänger-Themen 5
Daniel_L RegEx - Ersetzen ausschließen? Java Basics - Anfänger-Themen 6
S .txt einlesen->Zeilen ersetzen->neu.txt speichern Java Basics - Anfänger-Themen 13
S Backslash ersetzen. Java Basics - Anfänger-Themen 5
D mehrere Leerzeichen durch 1 Leerzeichen ersetzen Java Basics - Anfänger-Themen 3
M Panel ersetzen funktioniert nicht Java Basics - Anfänger-Themen 2
D Datentypen String Inhalte ersetzen Java Basics - Anfänger-Themen 8
N sich wiederholende arrayfelder ersetzen for-schleife Java Basics - Anfänger-Themen 9
C Variable Zeichenkette innerhalb einer Schleife ersetzen Java Basics - Anfänger-Themen 4
K Ersetzen von \" Zeichenfolge Java Basics - Anfänger-Themen 8
A Array einfügen, ersetzen und löschen Java Basics - Anfänger-Themen 1
G Enter-Zeichen aus String ersetzen Java Basics - Anfänger-Themen 5
J 4. vorkommende Zeichen ersetzen. Java Basics - Anfänger-Themen 7
V Bilder auf einer Seite markieren und ersetzen Java Basics - Anfänger-Themen 2
D Ascii-Code ersetzen mit Umlauten Java Basics - Anfänger-Themen 6
K Regex alle "<br><br>*" ersetzen Java Basics - Anfänger-Themen 2
G String Suchen ersetzen replace_all() Java Basics - Anfänger-Themen 6
W Zeichen ersetzen im InputStream Java Basics - Anfänger-Themen 3
C einen Link durch einen anderen Lunk ersetzen Java Basics - Anfänger-Themen 8
G Zeile in Textdatei ersetzen Java Basics - Anfänger-Themen 9
O Zeichen ersetzen Java Basics - Anfänger-Themen 3
F regex bei replaceAll und backslash ersetzen geht nicht. Java Basics - Anfänger-Themen 1
K String ersetzen Java Basics - Anfänger-Themen 10
C Rekursion durch Schleife ersetzen Java Basics - Anfänger-Themen 9
G Ersetzen von Zeichen "/" "" Java Basics - Anfänger-Themen 3
G Zeilenumbrüche in String durch <br> ersetzen? Java Basics - Anfänger-Themen 3
H String und HEX-Werte ersetzen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben