una posicion parte manejo extraer caracteres caracter cadenas cadena buscar agregar java string reflection velocity

posicion - manejo de cadenas en java



Reemplazo de cadena en Java, similar a una plantilla de velocidad (6)

Aquí hay un resumen de cómo podrías hacer esto. Debería ser relativamente sencillo implementarlo como código real.

  1. Crea un mapa de todos los objetos a los que se hará referencia en la plantilla.
  2. Use una expresión regular para buscar referencias de variables en la plantilla y reemplácelas con sus valores (vea el paso 3). La clase Matcher será útil para buscar y reemplazar.
  3. Dividir el nombre de la variable en el punto. user.name se convertiría en user y name . Busque el user en su mapa para obtener el objeto y use el reflection para obtener el valor del name del objeto. Suponiendo que sus objetos tienen getters estándar, buscará un método getName e invocarlo.

¿Hay algún mecanismo de reemplazo de String en Java, donde puedo pasar objetos con un texto y reemplaza la cadena cuando ocurre?
Por ejemplo, el texto es:

Hello ${user.name}, Welcome to ${site.name}.

Los objetos que tengo son "user" y "site" . Quiero reemplazar las cadenas dadas dentro de ${} con sus valores equivalentes de los objetos. Esto es lo mismo que reemplazamos objetos en una plantilla de velocidad.


Eche un vistazo a la clase java.text.MessageFormat , MessageFormat toma un conjunto de objetos, los formatea y luego inserta las cadenas formateadas en el patrón en los lugares apropiados.

Object[] params = new Object[]{"hello", "!"}; String msg = MessageFormat.format("{0} world {1}", params);



Lancé una pequeña implementación de prueba de esto. La idea básica es llamar al format y pasar la cadena de formato, y un mapa de objetos, y los nombres que tienen localmente.

El resultado de lo siguiente es:

Mi perro se llama fido, y Jane Doe lo posee.

public class StringFormatter { private static final String fieldStart = "//$//{"; private static final String fieldEnd = "//}"; private static final String regex = fieldStart + "([^}]+)" + fieldEnd; private static final Pattern pattern = Pattern.compile(regex); public static String format(String format, Map<String, Object> objects) { Matcher m = pattern.matcher(format); String result = format; while (m.find()) { String[] found = m.group(1).split("//."); Object o = objects.get(found[0]); Field f = o.getClass().getField(found[1]); String newVal = f.get(o).toString(); result = result.replaceFirst(regex, newVal); } return result; } static class Dog { public String name; public String owner; public String gender; } public static void main(String[] args) { Dog d = new Dog(); d.name = "fido"; d.owner = "Jane Doe"; d.gender = "him"; Map<String, Object> map = new HashMap<String, Object>(); map.put("d", d); System.out.println( StringFormatter.format( "My dog is named ${d.name}, and ${d.owner} owns ${d.gender}.", map)); } }

Nota: Esto no se compila debido a excepciones no controladas. Pero hace que el código sea mucho más fácil de leer.

Además, no me gusta que tenga que construir el mapa usted mismo en el código, pero no sé cómo obtener los nombres de las variables locales de forma programática. La mejor manera de hacerlo es recordar colocar el objeto en el mapa tan pronto como lo crees.

El siguiente ejemplo produce los resultados que desea de su ejemplo:

public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); Site site = new Site(); map.put("site", site); site.name = ".com"; User user = new User(); map.put("user", user); user.name = "jjnguy"; System.out.println( format("Hello ${user.name},/n/tWelcome to ${site.name}. ", map)); }

También debo mencionar que no tengo idea de qué es Velocity, así que espero que esta respuesta sea relevante.


No hay nada fuera de la caja que sea comparable a la velocidad, ya que la velocidad se escribió para resolver exactamente ese problema. Lo más cercano que puedes probar es buscar en el formateador

http://cupi2.uniandes.edu.co/site/images/recursos/javadoc/j2se/1.5.0/docs/api/java/util/Formatter.html

Sin embargo, el formateador, hasta donde yo sé, fue creado para proporcionar opciones de formato similares a C en Java, por lo que puede no rayar exactamente su picazón, pero le invitamos a probar :).


Usa apache commons lang.

https://commons.apache.org/proper/commons-lang/

Lo hará por usted (y su fuente abierta ...)

Map<String, String> valuesMap = new HashMap<String, String>(); valuesMap.put("animal", "quick brown fox"); valuesMap.put("target", "lazy dog"); String templateString = "The ${animal} jumped over the ${target}."; StrSubstitutor sub = new StrSubstitutor(valuesMap); String resolvedString = sub.replace(templateString);