Laden...

Mehrere sich überschneidende Textteile ersetzen

Erstellt von Hirnhamster vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.812 Views
H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 13 Jahren
Mehrere sich überschneidende Textteile ersetzen

Hey Leute,
ich suche einen Algorithmus der eine Menge von Textteilen in einem Text ersetzt. Die Textteile können sich dabei überschneiden, dürfen aber nicht erneut ersetzt werden.

Mal ein Beispiel:

Ersetzungen:
Haus => Boot
Boot => Schiff

Text:
Mein Wohnort ist ein Haus.

gewünschtes Resultat:
Mein Wohnort ist ein Boot.

Einschränkungen

  1. Die Ersetzungen können auch ganze Sätze sein, d.h. sie können beliebig viele Leerzeichen enthalten. Es ist also nicht möglich, den Text mittels Split(" "); zu trennen und dann mit jedem Wort einen Lookup in der Ersetzungstabelle vorzunehmen.

  2. Die Ersetzungen werden erst im Laufe des Algorithmus definiert. D.h. ein User bekommt bekommt ein Wort angezeigt, zu dem es Ersetzungen gibt und kann dann auswählen, durch welche Wörter dieses Wort ersetzt werden soll.

Hoffe das Problem ist einigermaßen verständlich 😃

Grüße
Hamster

PHP Tutorials zum PHP lernen

P
660 Beiträge seit 2008
vor 13 Jahren

Hallo,

ich denke mal dass String.Replace deine Anforderungen erfüllen dürfte

MfG
ProGamer*Der Sinn Des Lebens Ist Es, Den Sinn Des Lebens Zu Finden! *"Wenn Unrecht zu Recht wird dann wird Widerstand zur Pflicht." *"Ignorance simplifies ANY problem." *"Stoppt die Piraterie der Musikindustrie"

T
415 Beiträge seit 2007
vor 13 Jahren

Ich würde da eher zu string.Format greifen.


string stub = "Mein {0} ist ein {1}";

string result = string.Format(stub, "Haus", "Boot");

A
118 Beiträge seit 2009
vor 13 Jahren

Das mit dem doppelt ersetzen kann man auch leicht umgehen, indem man in deinem Beispiel zuerst alle "Boot" mit "Schiff" ersetzt und erst dann alle "Haus" mit "Boot".

Gruss Aratar

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Hirnhamster,

ein mehrfaches String.Replace wird nur dann den gewünschten Effekt haben, wenn man erst mal alles so durch Hilfszeichenfolgen ersetzt, das Konflikte ausgeschlossen sind. String-Format hilft gar nicht, wenn der Input-String von außen geliefert wird. Aber Es geht mit Regex-Replace und einem MatchEvaluator ganz einfach und sehr komfortabel.

Per Regex nach allen Begriffen gleichzeitig suchen, hier also nach "(Haus|Boot)". Dabei die einzelnen Suchbegriffe erforderlichenfalls erst durch Regex.Escape jagen. Im Match-Evaluator den zugehörigen Ersetzungsbegriff zurückliefern, am einfachsten aus einem Dictionary<>.

herbivore

2.891 Beiträge seit 2004
vor 13 Jahren

Einschränkungen

Wie sieht es eigentlich mit Groß/Kleinschreibung bzw. zusammengesetzten Substantiven aus?
Bsp. wenn du "Haus" durch "Boot" ersetzen willst, was wird mit "Hausboot" oder "Reihenhaus" gemacht?

Gruß,
dN!3L

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo dN!3L,

was der OP will, kann ich natürlich nicht sagen, aber wenn er nur ganze Worte ersetzen will, wäre das bei dem Regex-Ansatz nur eine minimale Änderung nötig: einfach \b am Anfang und am Ende einfügen.

herbivore