Zeichenkette aus Zeichenkette ersetzen mit Hashtable

  • Themenstarter Themenstarter newbie1234
  • Beginndatum Beginndatum
N

newbie1234

Hallo zusammen,

ich möchte mit Hilfe einer Hashtable einen String durchsuchen und die entsprechenden Stellen verschlüsseln. Also der String soll durchsucht werden, und immer wenn er eine Zeichenkette findet, die in der Hashtable steht, soll er diese Zeichenkette gegen das Hashtable-gegenstück austauschen.

Also die Hashtable sieht so aus:


Hashtable<String, String> h = new Hashtable<String, String>();

h.put("ooo" , "xxx");



Wenn die Eingabe also "Ein ooo Test" lautet, soll das dann am Ende "Ein xxx Test" lauten.
Könnt ihr mir ein Tip bzw. Codebeispiel geben, wie ich das umsetzen kann?
 
Java:
Hashtable<String, String> h = ...
String text = ...
for (String key : h.keySet()) {
    text = text.replaceAll(key, h.get(key));
}
 
Das geht leider nicht. Ich hab ein blödes Beispiel genommen für die Hashwerte. Wenn ich mehrere Stellen habe ich die ersetzen will, dann ersetzt er auch das gerade ersetzte. also ich hab folgende Hashwerte:

h.put("!" , "&#33");
h.put("--","&#45&#45");
h.put("#","&#35");


Wenn der String ein "!" hat, dann ersetzt er dies mit "&#33". Im nächsten Durchlauf findet er aber dieses "#" und ersetzt es. Er müsste also auf einmal alle Hashkeys finden und ersetzen.
 
Das geht so dann freilich nicht, richtig.

Ein Ansatz wäre dann, dass "#" außerhalb des Hashtables vor allen anderen Ersetzungen ersetzt wird. Also so:

Java:
String text = ...
text = text.replaceAll("#", "&#35");

// h beinhaltet nicht das Mapping "#" => "&#35"
for (String key : h.keySet()) {
    text = text.replaceAll(key, h.get(key));
}

Der zweite Ansatz, der mir spontan einfällt, ist, dass du die Mappings zunächst schützt. So, wie ich das sehe, willst du bestimmte Zeichen oder Strings in XML-Entities umwandeln. Klar, dass dir da das Gatterzeichen im Weg ist. Mach's doch einfach so, dass du anstatt der Zeichenkombination "&#" einen Platzhalter verwendest, der so nicht im Text vorkommt. Also einen eindeutigen Identifikator, beispielsweise "XXXMMMLLL" oder was ähnliches. Nach dem Mapping ersetzt du diesen Identifikator dann mit "&#". Bespielsweise so:

Java:
h.put("!" , "XXXMMMLLL33");
h.put("--","XXXMMMLLL45XXXMMMLLL45");
h.put("#","XXXMMMLLL35");
...
String text = ...
for (String key : h.keySet()) {
    text = text.replaceAll(key, h.get(key));
}
text = text.replaceAll("XXXMMMLLL", "&#");
 
Zurück