2012-06-02 28 views
5

Tengo una cadena larga. Quiero reemplazar todas las coincidencias con parte de la expresión regular correspondiente (grupo).Reemplazar cadena con parte de la expresión regular correspondiente

Por ejemplo:

String = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>". 

quiero reemplazar todas las palabras "is" por, digamos, "<h1>is</h1>". El caso debe seguir siendo el mismo que el original. Por lo que la cadena final que quiero es:

This <h1>is</h1> a great day, <h1>is</h1> it not? If there <h1>is</h1> something, 
THIS <h1>IS</h1> it. <b><h1>is</h1></b>. 

La expresión regular que estaba tratando:

Pattern pattern = Pattern.compile("[.>, ](is)[.<, ]", Pattern.CASE_INSENSITIVE); 
+2

Cuando has probado, ¿qué pasó? –

+0

El patrón coincide bien. Lo que no entiendo es cómo reemplazarlo. – varunl

Respuesta

8

La clase Matcher se usa comúnmente junto con Pattern. Utilice el método Matcher.replaceAll() para reemplazar todas las coincidencias de la cadena

String str = "This is a great day..."; 
Pattern p = Pattern.compile("\\bis\\b", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(str); 
String result = m.replaceAll("<h1>is</h1>"); 

Nota: Usando el comando \b expresión regular coincidirá en un límite de palabra (como espacios en blanco). Esto es útil para asegurar que solo coincida la palabra "es" y no palabras que contengan las letras "i" y "s" (como "isla").

4

De esta manera:

str = str.replaceAll(yourRegex, "<h1>$1</h1>"); 

El $1 se refiere al texto capturado por el grupo # 1 en tu expresión regular

+0

La desventaja de esta solución es que siempre tendrá en cuenta las mayúsculas y minúsculas. No hay forma de definir la expresión regular para que no distinga entre mayúsculas y minúsculas. – Michael

+2

@Michael: solo incluye un modificador '(? I)' al comienzo de la expresión regular si necesitas insensibilidad a mayúsculas y minúsculas. –

+0

Oh, no lo sabía.Ignora mi comentario. :( – Michael

0

Simplemente use una retro-referencia para eso.

"This is a great day, is it not? If there is something, THIS IS it. <b>is</b>".replaceAll("[.>, ](is)[.<, ]", "<h1>$2</h1>"); debería hacer.

+0

Una vez más, no se puede decir que la expresión regular no distinga entre mayúsculas y minúsculas con esta solución. – Michael

+0

No importa, puede anteponer la cadena de expresiones regulares con '(? I)' para que no distinga entre mayúsculas y minúsculas. – Michael

3

respuesta de Michael es mejor, pero si le toca sólo quieren específicamente [.>, ] y [.<, ] como límites, puede hacerlo de esta manera:

String input = "This is a great day, is it not? If there is something, THIS IS it. <b>is</b>"; 
Pattern p = Pattern.compile("(?<=[.>, ])(is)(?=[.<, ])", Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher(input); 
String result = m.replaceAll("<h1>$1</h1>"); 
1
yourStr.replaceAll("(?i)([.>, ])(is)([.<, ])","$1<h1>$2</h1>$3") 

(?i) para indicar ignorando mayúsculas y minúsculas; Envuelva todo lo que desee reutilizar con corchetes, vuelva a utilizarlos con $ 1 $ 2 y $ 3, concatenarlos en lo que desea.

0

puede ser una adición tardía, pero si alguien está buscando esto como
Buscando 'cosa' y también que necesita 'Algo' también debe ser tomada como resultado,

patrón p = Pattern.compile ("([^] ) es ([^ \.])");
String result = m.replaceAll ("< \ h1> $ 1is $ 2 </h1>");

resultará < \ h1> Algo </h1> también

Cuestiones relacionadas