Saya memiliki template String berikut: "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"
.
Saya juga memiliki variabel String untuk nama, nomor faktur, dan tanggal jatuh tempo - apa cara terbaik untuk mengganti token di template dengan variabel?
(Perhatikan bahwa jika suatu variabel mengandung token, itu TIDAK boleh diganti).
EDIT
Dengan terima kasih kepada @laginimaineb dan @ alan-moore, inilah solusi saya:
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();
}
Jawaban:
Cara paling efisien adalah menggunakan matcher untuk terus menemukan ekspresi dan menggantinya, lalu menambahkan teks ke pembuat string:
sumber
Saya benar-benar tidak berpikir Anda perlu menggunakan mesin templating atau semacamnya untuk ini. Anda dapat menggunakan
String.format
metode ini, seperti:sumber
Sayangnya metode String.format nyaman yang disebutkan di atas hanya tersedia mulai dengan Java 1.5 (yang seharusnya cukup standar saat ini, tetapi Anda tidak pernah tahu). Selain itu, Anda juga dapat menggunakan class MessageFormat Java untuk mengganti placeholder.
Ini mendukung placeholder dalam bentuk '{number}', jadi pesan Anda akan terlihat seperti "Halo {0} Silakan temukan lampiran {1} yang jatuh tempo pada {2}". String ini dapat dengan mudah dieksternalisasi menggunakan ResourceBundles (misalnya untuk pelokalan dengan beberapa lokal). Penggantian akan dilakukan menggunakan metode static'format 'kelas MessageFormat:
sumber
StringBuilder.append()
s dan saya berpikir "Tentunya ada cara yang lebih baik ... sesuatu yang lebih Pythonic ..." - dan sial, saya pikir metode ini mungkin mendahului metode pemformatan Python. Sebenarnya ... ini mungkin lebih tua dari 2002 ... Saya tidak dapat menemukan kapan ini benar-benar muncul ...Anda dapat mencoba menggunakan pustaka template seperti Apache Velocity.
http://velocity.apache.org/
Berikut ini contohnya:
Outputnya adalah:
sumber
Anda dapat menggunakan pustaka template untuk penggantian template yang kompleks.
FreeMarker adalah pilihan yang sangat bagus.
http://freemarker.sourceforge.net/
Tetapi untuk tugas sederhana, ada kelas utilitas sederhana yang dapat membantu Anda.
org.apache.commons.lang3.text.StrSubstitutor
Ini sangat kuat, dapat disesuaikan, dan mudah digunakan.
Misalnya, jika Anda ingin mengganti variabel lingkungan sistem menjadi string template, berikut kodenya:
sumber
Output: Halo Gabung! Anda memiliki 10 pesan "
sumber
Itu tergantung di mana data sebenarnya yang ingin Anda ganti berada. Anda mungkin memiliki Peta seperti ini:
berisi semua data yang bisa diganti. Kemudian Anda dapat mengulang peta dan mengubah semua yang ada di String sebagai berikut:
Anda juga bisa mengulang String dan menemukan elemen di peta. Tapi itu sedikit lebih rumit karena Anda perlu mengurai String yang mencari []. Anda dapat melakukannya dengan ekspresi reguler menggunakan Pola dan Pencocokan.
sumber
sumber
Solusi saya untuk mengganti token gaya $ {variable} (terinspirasi oleh jawaban di sini dan oleh Spring UriTemplate):
sumber
http://github.com/niesfisch/tokenreplacer
sumber
Dengan Apache Commons Library, Anda cukup menggunakan Stringutils.replaceEach :
Dari dokumentasi :
sumber
FYI
Dalam bahasa baru Kotlin, Anda dapat menggunakan "Template String" di kode sumber Anda secara langsung, tidak ada library pihak ketiga atau mesin template yang perlu melakukan penggantian variabel.
Itu adalah ciri dari bahasa itu sendiri.
Lihat: https://kotlinlang.org/docs/reference/basic-types.html#string-templates
sumber
Di masa lalu, saya telah memecahkan masalah semacam ini dengan StringTemplate dan Template Groovy .
Pada akhirnya, keputusan menggunakan mesin template atau tidak harus didasarkan pada faktor-faktor berikut:
Jika salah satu hal di atas berlaku untuk proyek Anda, saya akan mempertimbangkan untuk menggunakan mesin templating, yang sebagian besar menyediakan fungsionalitas ini, dan banyak lagi.
sumber
Saya dulu
sumber
Variabel berikut menggantikan formulir
<<VAR>>
, dengan nilai-nilai yang dicari dari Peta. Anda dapat mengujinya secara online di siniMisalnya, dengan string input berikut
dan nilai variabel berikut
menghasilkan berikut ini
Ini kodenya
dan meskipun tidak diminta, Anda dapat menggunakan pendekatan serupa untuk mengganti variabel dalam string dengan properti dari file application.properties Anda, meskipun ini mungkin sudah dilakukan:
sumber