Recupere múltiples datos dentro o {} bloques en una cadena en java

Básicamente, necesito recuperar datos dentro de <> o {} bloques en una cadena en Java.

La cadena puede contener o no una etiqueta <> o {}.

La cadena puede contener varios bloques <> o {}.

Los datos dentro de los bloques <> y {} son básicamente variables o nombres de funciones.

    d1 = "1234";
    d2 = "5678";
    sampleString = "aaa<d1>aaa{d1}aaa<d2>aaa";

Necesito que el resultado sea similar a algo como esto.

    resultString = "aaa1234aaa4321aaa5678aaa";

gracias de antemano. :)

EDITAR

Debo tener en cuenta que los valores dentro de los bloques <> y {} son dinámicos.

podría tener

    sampleString = "aaa<d5>aaa{d1}aaa<d2>aaa";

lo que significa que obtendría el valor d5 de una propiedad/variable/parámetro/etc.

Debería haber dicho eso desde el principio. :pags

preguntado el 04 de julio de 12 a las 07:07

¿Puede el texto dentro <> y {} contiene <>{}? -

d1,d2 son estáticos o dinámicos? -

@Hemant Metalia sí, son dinámicos -

5 Respuestas

Bueno, esta es una tarea clásica de expresiones regulares que puede resolver con Pattern and Matcher en Java. En primer lugar, piense en la expresión regular que necesita para capturar esta cadena independientemente de la implementación de Java. algo por el estilo "(?:.*<(.*?)>.*)|(?:.*{(.*?)}.*)" debería ayudarte a capturar la cadena. puede usar un Matcher para hacer la coincidencia y ejecutar en un ciclo while mientras que el método .find() del Matcher no devuelve NULL (es decir, todavía hay una coincidencia en la cadena). En el ciclo, reemplace el grupo necesario.

Respondido 04 Jul 12, 07:07

Podrías simplificar el | mediante el uso de clases de caracteres [<{] y [>}] aunque eso coincidiria "aaa<d1}aaa" - Zac

de acuerdo, no veo una forma elegante de deshacerte de la tubería..., tal vez podrías perderla y verificar los números pares de '{' o '<' pero no sé si eso es más eficiente que verificarlo en la expresión regular - wilfo

Podrías hacer 2 expresiones regulares diferentes, aunque eso es más o menos lo que hace o . - Zac

Primero, crea un Map por tus valores:

Map<String, String> values = new HashMap<String, String>();
values.put("d1", "1234");
values.put("d2", "5678");

Luego, encuentre todas las coincidencias y reemplácelas:

Matcher matcher = Pattern.compile("<(.*?)>").matcher(text);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
    matcher.appendReplacement(sb, values.get(matcher.group(1)));
}
matcher.appendTail(sb);

Y de nuevo para el otro patrón:

matcher = Pattern.compile("\\{(.*?)\\}").matcher(sb.toString());
sb = new StringBuffer();
while (matcher.find()) {
      matcher.appendReplacement(sb, new StringBuffer(values.get(matcher.group(1))).reverse().toString());
}
matcher.appendTail(sb);

Respondido 04 Jul 12, 07:07

    String d1 = "1234";
    String d2 = "5678";
    String sampleString = "aaa<d1>aaa{d1}aaa<d2>aaa";
    String finalStirng= sampleString.replaceAll("<d1>", d1).replaceAll("\\{d1\\}", d1).replaceAll("<d2>", d2).replaceAll("\\{d2\\}", d2);
    System.out.println("finalStirng= " + finalStirng);

Los { y } son especiales en el dialecto de expresiones regulares de Java. Así que debes escapar de ellos: como "\\{d1\\}".

Respondido 04 Jul 12, 07:07

Pruebe éste

sampleString = sampleString.replaceAll("<d1>",d1).replaceAll("{d1}",new StringBuffer(d1).reverse().toString()).replaceAll("<d2>",d2);

Respondido 04 Jul 12, 07:07

No creo que @DRTauli sepa lo que va a haber dentro del <> or {} por lo que no se pueden buscar directamente. - Zac

Un enfoque directo sería usar expresiones regulares como se mencionó antes

String resultString = "";  
resultString = sampleString.replaceAll("<d1>",d1);  
resultString = resultString.replaceAll("\\{d1\\}",d1);  
resultString = resultString.replaceAll("<d2>",d2);  

tenga en cuenta que esto funcionaría (aunque no se ha probado) para el escenario específico que ha descrito, pero no para escenarios genéricos, ya que los caracteres entre las etiquetas <> o {} pueden afectar la expresión regular. Depende de lo que haya entre tus etiquetas <> o {}.

Podría ser mejor pensar en usar algo como <.*> como su condición de expresión regular...

Respondido 04 Jul 12, 07:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.