Recupere múltiples datos dentro o {} bloques en una cadena en java
Frecuentes
Visto 125 equipos
2
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
5 Respuestas
2
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
1
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
1
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
0
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 java regex or haz tu propia pregunta.
¿Puede el texto dentro
<>
y{}
contiene<>{}
? - nhahtdhd1,d2 son estáticos o dinámicos? - Hemant Metalia
@Hemant Metalia sí, son dinámicos - DRTauli