Mehrere Ersetzungen von Zeichenketten ohne Auswirkung auf den ersetzten Text in nachfolgenden Iterationen

8

Ich habe früher über Briefe geschrieben, aber das ist ein anderes Thema, ich habe eine JSON-Antwort, die 2 Objekte enthält, from und to , from ist was zu ändern, und to ist was es wird zu geändert werden.

Mein Code ist:

%Vor%

Zum Beispiel ist die JSON-Antwort:

%Vor%

String.replace() Methode funktioniert hier nicht, weil es zuerst a zu bhduh ersetzt, dann b zu eieja , ABER hier ist das Problem, es wird b in bhduh konvertieren zu eieja , was ich nicht möchte.

Ich möchte die Buchstaben und "Wörter" im String nach dem Json perfekt konvertieren, aber das, woran ich versage.

Neuer Code:

%Vor%

Ausgabe:

%Vor%     
Jaeger 10.10.2016, 17:05
quelle

8 Antworten

2

Hier ist eine Methode, die ausschließlich Java ist. Ich habe versucht, hier keine Java 8-Methoden zu verwenden.

%Vor%

Beispieltestprogramm

%Vor%

Ausgabe:

%Vor%

Erklärung

Der Algorithmus ist rekursiv und macht einfach Folgendes:

  • Wenn ein in der Zeichenfolge gefundenes Muster mit einem Muster in der from -Liste übereinstimmt
    • Wenn vor diesem Muster eine Zeichenfolge vorhanden ist, wenden Sie den Algorithmus auf diese Zeichenfolge an
    • Ersetzen Sie das gefundene Muster durch das entsprechende Muster in der to -Liste
    • fügt die Ersetzung an die neue Zeichenfolge an
    • Verwerfen Sie das Muster in der from -Liste und wiederholen Sie den Algorithmus für den Rest der Zeichenfolge
  • Andernfalls fügen Sie den Rest der Zeichenfolge an die neue Zeichenfolge
  • an
smac89 19.10.2016, 05:38
quelle
4

Ihre Frage wäre klarer, wenn Sie die erwartete Ausgabe für die Funktion angegeben hätten.

Angenommen, es ist: ab b test a b >>>> bhduheieja eieja neesjt bhduh eieja

Dann sehen Sie Folgendes, der Schlüsselpunkt im Javadoc ist "Dies wird nicht wiederholt"

Ссылка

  

Ersetzt alle Vorkommen von Strings innerhalb eines anderen Strings.   Ein NULL-Verweis, der an diese Methode übergeben wird, ist ein No-Op oder, wenn überhaupt, "Suche"   Zeichenfolge "oder" zu ersetzende Zeichenfolge "ist null, diese Ersetzung wird ignoriert.    Dies wird nicht wiederholt. Um Wiederholungen zu wiederholen, rufen Sie das Überladene auf   Methode.

Beispiel 1

%Vor%

Beispiel 2

%Vor%     
Alan Hay 18.10.2016 18:50
quelle
3

Versuchen Sie Folgendes:

Lösung 1: Überstreiche die String -Zeichen nacheinander und verschiebe das neue String in ein neues StringBuffer oder StringBuilder und rufe toString() auf, um das Ergebnis zu erhalten. Dazu müssen Sie den String-Matching-Algorithmus implementieren.

Lösung 2 (mit Regex): Dazu müssen Sie die Domain Ihrer Zeichenfolge kennen. Zum Beispiel ist es [a-zA-Z] , dann können andere beliebige Zeichen (nicht Teil der Domäne) für den Zwischenschritt verwendet werden. Ersetzen Sie zuerst die tatsächlichen Zeichen durch beliebige und dann beliebige durch das Ziel . Im Beispiel unten sind [!@#] die willkürlichen Zeichen. Dies kann auch ein zufälliger Wert \uxxxx sein.

%Vor%     
Amber Beriwal 10.10.2016 18:14
quelle
3

Ihr Problem ist ziemlich häufig. Um es zusammenzufassen:

%Vor%

Gibt: this is bar test string with bar

Von Ihnen erwartet: this is foo test string with bar

Sie können StrSubstitutor von Apache Commons Lang

Aber zuerst müssen Sie Platzhalter in Ihre Zeichenfolge einfügen:

%Vor%

Und dann benutze StrSubstitutor

%Vor%

Es gibt: this is foo test string with bar

    
ToYonos 17.10.2016 10:23
quelle
1

Sie könnten split wie verwenden: %Code% dann parst du einfach das Von und Bis in jedes Stück und wendet sie mit replace () an, dann füge die Schnur wieder zusammen. (und bitte nutzen Sie Ihre Großschreibung Ihrer Variablen / Methoden richtig - macht es sehr schwer zu lesen, wie Sie es haben)

    
Brian Pipa 14.10.2016 20:13
quelle
1

Apache Commons StringUtils::replaceEach tut dies.

%Vor%     
Daniel Rodriguez 18.10.2016 19:23
quelle
1

Warum halten Sie es nicht sehr einfach (wenn das JSON immer im selben Format ist, zB vom selben System). Anstatt from durch to zu ersetzen, ersetzen Sie das gesamte Markup:

Ersetze "from":"*from*" durch "from":"*to*"

    
Hugo Delsing 19.10.2016 15:16
quelle
-3

Warum ändern Sie nicht einfach die tatsächlichen "to" und "from" Etiketten? So geraten Sie nicht in eine Situation, in der "Bhudh" zu "Eieja" wird. Tun Sie einfach eine Zeichenfolge ersetzen "von" und "bis".

    
Shadowman 10.10.2016 17:14
quelle

Tags und Links