Mam następujący ciąg szablonu: "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"
.
Mam też zmienne typu String na imię i nazwisko, numer faktury i termin płatności - jak najlepiej zastąpić tokeny w szablonie zmiennymi?
(Zwróć uwagę, że jeśli zmienna zawiera token, NIE powinna być zastępowana).
EDYTOWAĆ
Dzięki @laginimaineb i @ alan-moore, oto moje rozwiązanie:
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();
}
Odpowiedzi:
Najskuteczniejszym sposobem byłoby użycie dopasowania do ciągłego znajdowania wyrażeń i zastępowania ich, a następnie dołączania tekstu do konstruktora ciągów:
źródło
Naprawdę nie sądzę, abyś musiał używać do tego silnika szablonów lub czegoś podobnego. Możesz użyć tej
String.format
metody, na przykład:źródło
Niestety, wspomniana powyżej wygodna metoda String.format jest dostępna dopiero od wersji Java 1.5 (która w dzisiejszych czasach powinna być dość standardowa, ale nigdy nie wiadomo). Zamiast tego możesz również użyć klasy MessageFormat języka Java do zastąpienia symboli zastępczych.
Obsługuje symbole zastępcze w postaci „{numer}”, więc Twoja wiadomość będzie wyglądać następująco: „Witaj {0} Proszę znaleźć załączony {1}, którego termin upływa {2}”. Te ciągi można łatwo udostępniać na zewnątrz przy użyciu pakietów zasobów (np. W celu lokalizacji z wieloma lokalizacjami). Zastąpienie byłoby dokonane przy użyciu statycznej metody 'format' klasy MessageFormat:
źródło
StringBuilder.append()
si myślałem: „Na pewno jest lepszy sposób ... coś bardziej Pythonowego ...” - i cholera, myślę, że ta metoda może być starsza niż metody formatowania Pythona. Właściwie ... to może być starsze niż 2002 ... Nie mogę znaleźć, kiedy to faktycznie powstało ...Możesz spróbować użyć biblioteki szablonów, takiej jak Apache Velocity.
http://velocity.apache.org/
Oto przykład:
Wynik byłby następujący:
źródło
Możesz użyć biblioteki szablonów do złożonej wymiany szablonów.
FreeMarker to bardzo dobry wybór.
http://freemarker.sourceforge.net/
Ale w przypadku prostego zadania pomocna może być prosta klasa narzędziowa.
org.apache.commons.lang3.text.StrSubstitutor
Jest bardzo potężny, konfigurowalny i łatwy w użyciu.
Na przykład, jeśli chcesz zamienić systemową zmienną środowiskową na ciąg szablonu, oto kod:
źródło
Wynik: Hello Join! Masz 10 wiadomości ”
źródło
Zależy to od tego, gdzie znajdują się rzeczywiste dane, które chcesz zastąpić. Możesz mieć taką mapę:
zawierający wszystkie dane, które można zastąpić. Następnie możesz iterować po mapie i zmienić wszystko w ciągu w następujący sposób:
Możesz także iterować po łańcuchu i znaleźć elementy na mapie. Ale to jest trochę bardziej skomplikowane, ponieważ musisz przeanalizować String w poszukiwaniu []. Możesz to zrobić za pomocą wyrażenia regularnego używając Pattern i Matcher.
źródło
źródło
Moje rozwiązanie do zamiany tokenów w stylu $ {variable} (zainspirowane odpowiedziami tutaj i Spring UriTemplate):
źródło
http://github.com/niesfisch/tokenreplacer
źródło
Dzięki Apache Commons Library możesz po prostu użyć Stringutils.replace Każdy :
Z dokumentacji :
źródło
FYI
W nowym języku Kotlin możesz używać „szablonów ciągów” bezpośrednio w kodzie źródłowym, żadna biblioteka lub silnik szablonów innych firm nie musi zastępować zmiennych.
Jest to cecha samego języka.
Zobacz: https://kotlinlang.org/docs/reference/basic-types.html#string-templates
źródło
W przeszłości rozwiązałem ten problem za pomocą StringTemplate i Groovy Templates .
Ostatecznie decyzja o użyciu silnika szablonów lub nie powinna być oparta na następujących czynnikach:
Jeśli którekolwiek z powyższych dotyczy twojego projektu, rozważę użycie silnika szablonów, z których większość zapewnia tę funkcjonalność i nie tylko.
źródło
użyłem
źródło
Poniższy tekst zastępuje zmienne w formularzu
<<VAR>>
wartościami wyszukanymi z mapy. Możesz to przetestować online tutajNa przykład z następującym ciągiem wejściowym
i następujące wartości zmiennych
wyprowadza następujące
Oto kod
i chociaż nie jest to wymagane, możesz użyć podobnego podejścia do zastąpienia zmiennych w łańcuchu właściwościami z pliku application.properties, chociaż może to już być zrobione:
źródło