2011-11-28 15 views
5

Tengo texto con varias frases #{key}. Por ejemplo:¿Cómo reemplazar todo # {key} en una cadena?

Lorem ipsum dolor sit amet, consectetur adipisicing #{key1}. Proin nibh 
augue, suscipit a, scelerisque #{key1}, lacinia in, mi. Cras vel #{key2}. 
Etiam pellentesque aliquet tellus. Phasellus pharetra nulla ac diam. 
Quisque semper #{key3} at risus. 

tengo que sustituir todos los valores de #{key} con los correspondientes messageSource.getMessage(key, null, locale) (messageSource es org.springframework.context.MessageSource), pero yo no soy bueno en expresiones regulares. ¿Cómo construir una expresión regular correcta?

Ejemplos:

#{texts.appName} need to replace with messageSource.getMessage("texts.appName", null, locale); 
#{my.company} need to replace with messageSource.getMessage("my.company", null, locale); 
+0

¡Mira mi respuesta! :) – HashimR

+0

mira la clase String en la API que te dirá todo lo que necesites – lancegerday

Respuesta

3

Suponiendo key es sólo un marcador de posición para cualquier nombre de su expresión regular sería algo como esto: #\{([\w\.]+)\}

Esto significa: cualquier secuencia de caracteres de palabra o puntos (\w\., que es equivalente a a-zA-Z0-9_\.) entre #{ y } se devuelve como grupo 1.

Ahora tiene que crear un matcher y iterar sobre los partidos, extraer la llave y vuelva a colocar el partido con su mensaje:

String input = "Lorem ipsum dolor sit amet, consectetur adipisicing #{key1}. " + 
    "Proin nibh augue, suscipit a, scelerisque #{key1}," + 
    "lacinia in, mi. Cras vel #{key2}. Etiam pellentesque aliquet tellus." + 
    " Phasellus pharetra nulla ac diam. Quisque semper #{key3} at risus."; 
StringBuffer result = new StringBuffer(); 

Pattern p = Pattern.compile("#\\{([\\w\\.]+)\\}"); 
Matcher m = p.matcher(input); 

while(m.find()) {  
    //extract the message for key = m.group(1) here 
    //i'll just mark the found keys 
    m.appendReplacement(result, "##" + m.group(1) + "##");  
} 
m.appendTail(result); 

System.out.println(result); //output: ... consectetur adipisicing ##key1## ... etc. 
2

dar a este regex una oportunidad:

#{([^}]+)} 
0

Uso yourString.replaceAll("\\#\\{key\\}", messageSource.getMessage(key, null, locale))

La primera barra invertida es para escapar de la segunda barra invertida de la interpretación de cadena de java. El segundo es para escapar del signo '#' (o los signos '{', '}') para la interpretación de expresiones regulares.

0

Aquí tienes. Ejemplo de trabajo:

Pattern p = Pattern.compile("\\Q#{\\E([^.]+)\\Q}\\E"); 
Matcher m = p.matcher(yourString); 
Pattern tempPattern = Pattern.compile("([#{][^.]+[}])"); 
Matcher tempMatcher = tempPattern.matcher(yourString); 


while(m.find() && tempMatcher.find()) {  

    String textToReplace = messageSource.getMessage(m.group(1), null, locale); 
    yourString = yourString.replace(tempMatcher.group(1), textToReplace); 
} 

System.out.println(yourString); 

Espero que ayude!

Cuestiones relacionadas