Ich habe die folgende Vorlage String : "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"
.
Ich habe auch String-Variablen für Name, Rechnungsnummer und Fälligkeitsdatum. Wie lassen sich die Token in der Vorlage am besten durch die Variablen ersetzen?
(Beachten Sie, dass eine Variable, die zufällig ein Token enthält, NICHT ersetzt werden sollte.)
BEARBEITEN
Dank @laginimaineb und @ alan-moore ist hier meine Lösung:
public static String replaceTokens(String text,
Map<String, String> replacements) {
Pattern pattern = Pattern.compile("\\[(.+?)\\]");
Matcher matcher = pattern.matcher(text);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
String replacement = replacements.get(matcher.group(1));
if (replacement != null) {
// matcher.appendReplacement(buffer, replacement);
// see comment
matcher.appendReplacement(buffer, "");
buffer.append(replacement);
}
}
matcher.appendTail(buffer);
return buffer.toString();
}
Antworten:
Am effizientesten wäre es, einen Matcher zu verwenden, um die Ausdrücke kontinuierlich zu finden und zu ersetzen, und dann den Text an einen String-Builder anzuhängen:
quelle
Ich glaube wirklich nicht, dass Sie dafür eine Template-Engine oder ähnliches verwenden müssen. Sie können die
String.format
Methode wie folgt verwenden:quelle
Leider ist die oben erwähnte komfortable Methode String.format nur ab Java 1.5 verfügbar (was heutzutage ziemlich Standard sein sollte, aber man weiß es nie). Stattdessen können Sie auch die Java- Klasse MessageFormat zum Ersetzen der Platzhalter verwenden.
Es werden Platzhalter in der Form '{number}' unterstützt, sodass Ihre Nachricht wie folgt aussehen würde: "Hallo {0}. Bitte finden Sie die angehängte {1}, die auf {2} fällig ist." Diese Zeichenfolgen können mithilfe von ResourceBundles problemlos externalisiert werden (z. B. zur Lokalisierung mit mehreren Gebietsschemas). Das Ersetzen würde mit der statischen 'Format'-Methode der Klasse MessageFormat erfolgen:
quelle
StringBuilder.append()
s behandelt wird, und dachte: "Sicher gibt es einen besseren Weg ... etwas mehr Pythonisches ..." - und heiliger Mist, ich denke, diese Methode könnte vor Pythons Formatierungsmethoden liegen. Eigentlich ... das ist vielleicht älter als 2002 ... Ich kann nicht finden, wann das tatsächlich zustande gekommen ist ...Sie können versuchen, eine Vorlagenbibliothek wie Apache Velocity zu verwenden.
http://velocity.apache.org/
Hier ist ein Beispiel:
Die Ausgabe wäre:
quelle
Sie können die Vorlagenbibliothek zum Ersetzen komplexer Vorlagen verwenden.
FreeMarker ist eine sehr gute Wahl.
http://freemarker.sourceforge.net/
Für einfache Aufgaben gibt es jedoch eine einfache Dienstprogrammklasse, die Ihnen helfen kann.
org.apache.commons.lang3.text.StrSubstitutor
Es ist sehr leistungsfähig, anpassbar und einfach zu bedienen.
Wenn Sie beispielsweise die Systemumgebungsvariable durch eine Vorlagenzeichenfolge ersetzen möchten, lautet der folgende Code:
quelle
Ausgabe: Hallo Join! Sie haben 10 Nachrichten "
quelle
Dies hängt davon ab, wo sich die tatsächlichen Daten befinden, die Sie ersetzen möchten. Möglicherweise haben Sie eine Karte wie diese:
enthält alle Daten, die ersetzt werden können. Anschließend können Sie die Karte durchlaufen und alles in der Zeichenfolge wie folgt ändern:
Sie können auch über den String iterieren und die Elemente in der Karte finden. Das ist jedoch etwas komplizierter, da Sie den String nach [] durchsuchen müssen. Sie können dies mit einem regulären Ausdruck unter Verwendung von Pattern und Matcher tun.
quelle
quelle
Meine Lösung zum Ersetzen von Token im Stil von $ {variable} (inspiriert von den Antworten hier und von der Spring UriTemplate):
quelle
http://github.com/niesfisch/tokenreplacer
quelle
Mit der Apache Commons Library können Sie einfach Stringutils.replaceEach verwenden :
Aus der Dokumentation :
quelle
Zu Ihrer Information
In der neuen Sprache Kotlin können Sie "String Templates" direkt in Ihrem Quellcode verwenden. Keine Bibliothek oder Template-Engine eines Drittanbieters muss die Variablen ersetzen.
Es ist ein Merkmal der Sprache selbst.
Siehe: https://kotlinlang.org/docs/reference/basic-types.html#string-templates
quelle
In der Vergangenheit habe ich diese Art von Problem mit StringTemplate und Groovy Templates gelöst .
Letztendlich sollte die Entscheidung, ob eine Template-Engine verwendet wird oder nicht, auf folgenden Faktoren beruhen:
Wenn einer der oben genannten Punkte auf Ihr Projekt zutrifft, würde ich die Verwendung einer Template-Engine in Betracht ziehen, von denen die meisten diese Funktionalität bieten, und mehr.
quelle
ich benutzte
quelle
Im Folgenden werden Variablen des Formulars
<<VAR>>
durch Werte ersetzt, die in einer Karte nachgeschlagen wurden. Sie können es hier online testenZum Beispiel mit der folgenden Eingabezeichenfolge
und die folgenden Variablenwerte
gibt folgendes aus
Hier ist der Code
und obwohl nicht angefordert, können Sie einen ähnlichen Ansatz verwenden, um Variablen in einer Zeichenfolge durch Eigenschaften aus Ihrer application.properties-Datei zu ersetzen, obwohl dies möglicherweise bereits durchgeführt wird:
quelle