mehrere replace in einem string

ancelimon

Mitglied
Ich komm nicht weiter..
ich muss mehrere Wörter in einem Word-Dokument ersetzten.
also zum Beispiel %ORT% mit Berlin.
Ich schreibe vorher in eine map ORT und Berlin
Die map und die Dateinamen übergebe ich an folgende Funktion:

Java:
private static final Pattern TOKEN_PATTERN = Pattern.compile(".*\\%(.+)\\%.*");
private static final String TOKEN_DELIMITER = "%";

private static void replaceTokensInTextFile(Map<String, String> map, String templateFileName, String newFileName) {
    	
        try {
            BufferedReader reader = new BufferedReader(new FileReader(templateFileName));
            BufferedWriter writer = new BufferedWriter(new FileWriter(newFileName));
            
            String line = reader.readLine();
            while (line != null) {
                Matcher m = TOKEN_PATTERN.matcher(line);
                if (m.matches()) {
                    String token = m.group(1);
                    String replacement = map.get(token);
                    if (replacement == null) {
                        replacement = "NULL";
                    }
                    line = line.replace(TOKEN_DELIMITER + token + TOKEN_DELIMITER, replacement);
                }
                writer.write(line);
 
                line = reader.readLine();
            }
            
            reader.close();
            writer.close();
 
        } catch (IOException e) {
            e.printStackTrace();
        }

im Grunde funktioniert das auch so.. das Problem ist aber, dass wenn in einer Zeile zwei Schlüssel vor kommen.. also z.B. %ORT% %PLZ% kommt alles durcheinander und nichts stimmt mehr.

Wie kann ich dieses Problem lösen?

Vielen Dank schon mal
 
> kommt alles durcheinander und nichts stimmt mehr.
genauer gehts nicht?
wollt gerade schon ein Beispiel bauen, siehe unten, aber du hast ja nichtmal eine Schleife, da wird sowieso nur maximal einmal ersetzt, wie soll das funktionieren?

zwei Tipps zum weitermachen:
beim Pattern an [c]".*\\%[^%]+\\%.*"[/c] oder ähnlich denken, damit wirklich nur Text zwischen zwei %-Zeichen gefunden wird, nicht mehrere zusammen

und dann noch der Vorschlag, direkt nach einzelnen Pattern zu suchen, ganz ohne Matcher
Java:
for (all keys) {
   line = line.replace("%"+key+"%", zugehöriger value);
}
bei vielen Keys und wirklich vielen Zeilen vielleicht zu aufwendig

----

hier ein brauchbareres Ausgangsprogramm für weitere Fragen
Java:
public class Test {
    private static final Pattern TOKEN_PATTERN = Pattern.compile(".*\\%(.+)\\%.*");
    private static final String TOKEN_DELIMITER = "%";

    public static void main(String[] args) throws Exception  {
        String line = "abc %ORT% def";
        Matcher m = TOKEN_PATTERN.matcher(line);
        if (m.matches()) {
            String token = m.group(1);
            String replacement = token.equals("ORT") ? "Hamburg" : "oben";
            line = line.replace(TOKEN_DELIMITER + token + TOKEN_DELIMITER, replacement);
        }
        System.out.println(line);
    }
}
 
Zuletzt bearbeitet von einem Moderator:
Bin mir nicht sicher, aber liegt vielleicht an dem regulären Ausdruck, den du verwendest. Du sagst damit ja im Prinzip "beliebig viele Zeichen, dann ein %, dann mind. ein beliebiges Zeichen, dann ein % und anschließend wieder beliebig viele Zeichen". Zwischen den beiden % können aber theoretisch auch % auftauchen. Weiß nicht, ob da evtl mit longest match gearbeitet wird und wie das funktioniert, aber möglich isses. Musst eben das zwischen den % ersetzen mit sowas wie
Code:
[^%]
(also alle Zeichen außer %) oder so.

Edit: da war ich wohl zu langsam 🙂
 

Neue Themen


Zurück
Oben