Tengo la siguiente cadena de plantilla: "Hello [Name] Please find attached [Invoice Number] which is due on [Due Date]"
.
También tengo variables de cadena para el nombre, el número de factura y la fecha de vencimiento: ¿cuál es la mejor manera de reemplazar los tokens en la plantilla con las variables?
(Tenga en cuenta que si una variable contiene un token, NO debe reemplazarse).
EDITAR
Gracias a @laginimaineb y @ alan-moore, aquí está mi solución:
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();
}
Respuestas:
La forma más eficiente sería usar un comparador para buscar continuamente las expresiones y reemplazarlas, luego agregar el texto a un generador de cadenas:
fuente
Realmente no creo que necesites usar un motor de plantillas ni nada por el estilo para esto. Puedes usar el
String.format
método, así:fuente
Desafortunadamente, el cómodo método String.format mencionado anteriormente solo está disponible a partir de Java 1.5 (que debería ser bastante estándar hoy en día, pero nunca se sabe). En lugar de eso, también puede usar la clase MessageFormat de Java para reemplazar los marcadores de posición.
Admite marcadores de posición en el formulario '{número}', por lo que su mensaje se vería como "Hola, {0} se adjunta {1} que vence el {2}". Estas cadenas se pueden externalizar fácilmente utilizando ResourceBundles (por ejemplo, para la localización con múltiples configuraciones regionales). El reemplazo se haría usando el método static'format 'de la clase MessageFormat:
fuente
StringBuilder.append()
sy estaba pensando "Seguramente hay una mejor manera ... algo más Pythonic ..." - y mierda, creo que este método puede ser anterior a los métodos de formato de Python. En realidad ... esto puede ser más antiguo que 2002 ... no puedo encontrar cuando esto realmente llegó a existir ...Podría intentar usar una biblioteca de plantillas como Apache Velocity.
http://velocity.apache.org/
Aquí hay un ejemplo:
La salida sería:
fuente
Puede utilizar la biblioteca de plantillas para reemplazar plantillas complejas.
FreeMarker es una muy buena opción.
http://freemarker.sourceforge.net/
Pero para una tarea simple, hay una clase de utilidad simple que puede ayudarlo.
org.apache.commons.lang3.text.StrSubstitutor
Es muy potente, personalizable y fácil de usar.
Por ejemplo, si desea sustituir la variable de entorno del sistema en una cadena de plantilla, aquí está el código:
fuente
Salida: ¡Hola, únete! Tienes 10 mensajes "
fuente
Depende de dónde se encuentren los datos reales que desee reemplazar. Es posible que tenga un mapa como este:
que contiene todos los datos que se pueden reemplazar. Luego, puede iterar sobre el mapa y cambiar todo en la Cadena de la siguiente manera:
También puede iterar sobre la Cadena y encontrar los elementos en el mapa. Pero eso es un poco más complicado porque necesita analizar la Cadena buscando []. Puede hacerlo con una expresión regular usando Pattern y Matcher.
fuente
fuente
Mi solución para reemplazar los tokens de estilo $ {variable} (inspirado en las respuestas aquí y en Spring UriTemplate):
fuente
http://github.com/niesfisch/tokenreplacer
fuente
Con Apache Commons Library, simplemente puede usar Stringutils.replaceEach :
De la documentación :
fuente
FYI
En el nuevo lenguaje Kotlin, puede usar "Plantillas de cadenas" en su código fuente directamente, ninguna biblioteca de terceros o motor de plantillas necesita hacer el reemplazo de la variable.
Es una característica del propio idioma.
Ver: https://kotlinlang.org/docs/reference/basic-types.html#string-templates
fuente
En el pasado, resolví este tipo de problema con StringTemplate y Groovy Templates .
En última instancia, la decisión de utilizar un motor de plantillas o no debe basarse en los siguientes factores:
Si algo de lo anterior se aplica a su proyecto, consideraría usar un motor de plantillas, la mayoría de los cuales brindan esta funcionalidad y más.
fuente
solía
fuente
Lo siguiente reemplaza las variables del formulario
<<VAR>>
con valores buscados en un mapa. Puedes probarlo online aquíPor ejemplo, con la siguiente cadena de entrada
y los siguientes valores de variable
produce lo siguiente
Aqui esta el codigo
y aunque no se solicite, puede usar un enfoque similar para reemplazar variables en una cadena con propiedades de su archivo application.properties, aunque es posible que esto ya se esté haciendo:
fuente