Reemplazo de Java Regex con grupo de captura

驴Hay alguna manera de reemplazar una expresi贸n regular con contenido modificado del grupo de captura?

Ejemplo:

Pattern regex = Pattern.compile("(\\d{1,2})"); Matcher regexMatcher = regex.matcher(text); resultString = regexMatcher.replaceAll("$1"); // *3 ?? 

Y me gustar铆a reemplazar todas las apariciones con $ 1 multiplicado por 3.

editar:

Parece que algo est谩 mal 馃檨

Si uso

 Pattern regex = Pattern.compile("(\\d{1,2})"); Matcher regexMatcher = regex.matcher("12 54 1 65"); try { String resultString = regexMatcher.replaceAll(regexMatcher.group(1)); } catch (Exception e) { e.printStackTrace(); } 

Lanza una IllegalStateException: no se encontraron coincidencias

Pero

 Pattern regex = Pattern.compile("(\\d{1,2})"); Matcher regexMatcher = regex.matcher("12 54 1 65"); try { String resultString = regexMatcher.replaceAll("$1"); } catch (Exception e) { e.printStackTrace(); } 

funciona bien, pero no puedo cambiar el $ 1 馃檨

editar:

Ahora funciona 馃檪

Qu茅 tal si:

 if (regexMatcher.find()) { resultString = regexMatcher.replaceAll( String.valueOf(3 * Integer.parseInt(regexMatcher.group(1)))); } 

Para obtener la primera coincidencia, use #find() . Despu茅s de eso, puede usar #group(1) para referirse a esta primera coincidencia, y reemplazar todas las coincidencias por el primer valor de maches multiplicado por 3.

Y en caso de que quiera reemplazar cada partido por el valor de ese partido multiplicado por 3:

  Pattern p = Pattern.compile("(\\d{1,2})"); Matcher m = p.matcher("12 54 1 65"); StringBuffer s = new StringBuffer(); while (m.find()) m.appendReplacement(s, String.valueOf(3 * Integer.parseInt(m.group(1)))); System.out.println(s.toString()); 

Es posible que desee revisar la documentaci贸n de Matcher , donde se cubren m谩s detalles y esto y mucho m谩s.

La respuesta de earl te da la soluci贸n, pero pens茅 que agregar铆a el problema que est谩 causando tu IllegalStateException . Est谩 llamando al group(1) sin haber llamado primero una operaci贸n de coincidencia (como find() ). Esto no es necesario si solo est谩 utilizando $1 ya que replaceAll() es la operaci贸n de coincidencia.

Fuente: java-implementation-of-rubys-gsub

Uso:

 // Rewrite an ancient unit of length in SI units. String result = new Rewriter("([0-9]+(\\.[0-9]+)?)[- ]?(inch(es)?)") { public String replacement() { float inches = Float.parseFloat(group(1)); return Float.toString(2.54f * inches) + " cm"; } }.rewrite("a 17 inch display"); System.out.println(result); // The "Searching and Replacing with Non-Constant Values Using a // Regular Expression" example from the Java Almanac. result = new Rewriter("([a-zA-Z]+[0-9]+)") { public String replacement() { return group(1).toUpperCase(); } }.rewrite("ab12 cd efg34"); System.out.println(result); 

Implementaci贸n (redise帽ado):

 import static java.lang.String.format; import java.util.regex.Matcher; import java.util.regex.Pattern; public abstract class Rewriter { private Pattern pattern; private Matcher matcher; public Rewriter(String regularExpression) { this.pattern = Pattern.compile(regularExpression); } public String group(int i) { return matcher.group(i); } public abstract String replacement() throws Exception; public String rewrite(CharSequence original) { return rewrite(original, new StringBuffer(original.length())).toString(); } public StringBuffer rewrite(CharSequence original, StringBuffer destination) { try { this.matcher = pattern.matcher(original); while (matcher.find()) { matcher.appendReplacement(destination, ""); destination.append(replacement()); } matcher.appendTail(destination); return destination; } catch (Exception e) { throw new RuntimeException("Cannot rewrite " + toString(), e); } } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(pattern.pattern()); for (int i = 0; i <= matcher.groupCount(); i++) sb.append(format("\n\t(%s) - %s", i, group(i))); return sb.toString(); } }