java - regular - ¿Cómo agregar Reemplazo en un grupo Matcher en lugar de todo el patrón?
expresiones regulares java (2)
Estoy usando un while(matcher.find())
para recorrer todas las coincidencias de un patrón. Para cada instancia o coincidencia de ese patrón que encuentre, quiero reemplazar matcher.group(3)
con un texto nuevo. Este texto será diferente para cada uno, así que estoy usando matcher.appendReplacement()
para reconstruir la cadena original con los nuevos cambios a medida que avanza. Sin embargo, appendReplacement()
reemplaza todo el patrón en lugar de solo el grupo.
¿Cómo puedo hacer esto pero solo modifico el tercer grupo de la coincidencia en lugar de todo el patrón?
Aquí hay un código de ejemplo:
Pattern pattern = Pattern.compile("THE (REGEX) (EXPRESSION) (WITH MULTIPLE) GROUPS");
Matcher matcher = pattern.matcher("THE TEXT TO SEARCH AND MODIFY");
StringBuffer buffer = new StringBuffer();
while(matcher.find()){
matcher.appendReplacement(buffer, processTheGroup(matcher.group(3));
}
pero me gustaría hacer algo como esto (obviamente esto no funciona).
...
while(matcher.find()){
matcher.group(3).appendReplacement(buffer, processTheGroup(matcher.group(3));
}
Algo así, donde solo reemplaza a cierto grupo, no a todo el patrón.
EDITAR: cambió el ejemplo de expresión regular para mostrar que no todos los patrones están agrupados.
Digamos que su patrón completo coincide con "(prefix)(infix)(suffix)"
, capturando las 3 partes en los grupos 1, 2 y 3 respectivamente. Ahora digamos que desea reemplazar solo el grupo 2 (el infijo), dejando el prefijo y el sufijo intactos como estaban.
Entonces, lo que hace es agregar el group(1)
coincidente (no alterado), el nuevo reemplazo para el group(2)
y el group(3)
coincidido (no alterado), así que algo como esto:
matcher.appendReplacement(
buffer,
matcher.group(1) + processTheGroup(matcher.group(2)) + matcher.group(3)
);
Esto aún igualará y reemplazará el patrón completo, pero como los grupos 1 y 3 quedan sin tocar, efectivamente solo se reemplaza el infijo.
Debería poder adaptar la misma técnica básica para su escenario particular.
Veo que esto ya tiene una respuesta aceptada, pero no es del todo correcto. La respuesta correcta parece ser algo como esto:
.appendReplacement("$1" + process(m.group(2)) + "$3");
Esto también ilustra que "$" es un carácter especial en .appendReplacement. Por lo tanto, debe tener cuidado en su función "proceso ()" para reemplazar todos "$" con "/ $". Matcher.quoteReplacement (replacementString) hará esto por ti (gracias @Med)
La respuesta aceptada anterior fallará si los grupos 1 o 3 contienen un "$". Terminarás con "java.lang.IllegalArgumentException: referencia de grupo no válida"