2010-02-05 25 views
5

Digamos que tengo la siguiente cadena:Java: reemplazar expresión regular con el partido procesado

String in = "A xx1 B xx2 C xx3 D"; 

Quiero el resultado:

String out = "A 1 B 4 C 9 D"; 

me gustaría hacerlo de una manera que se asemeja más:

String out = in.replaceAll(in, "xx\\d", 
    new StringProcessor(){ 
     public String process(String match){ 
      int num = Integer.parseInt(match.replaceAll("x","")); 
      return ""+(num*num); 
     } 
    } 
); 

Es decir, utilizando un procesador de cadena que modifica la subcadena coincidente antes de realizar la sustitución real.

¿Hay alguna biblioteca ya escrita para lograr esto?

Respuesta

7

Uso Matcher.appendReplacement():

String in = "A xx1 B xx2 C xx3 D"; 
    Matcher matcher = Pattern.compile("xx(\\d)").matcher(in); 
    StringBuffer out = new StringBuffer(); 
    while (matcher.find()) { 
     int num = Integer.parseInt(matcher.group(1)); 
     matcher.appendReplacement(out, Integer.toString(num*num)); 
    } 
    System.out.println(matcher.appendTail(out).toString()); 
+0

Genial, realmente pasado por alto este método! Gracias una tonelada. – glmxndr

+0

No sabía sobre 'appendReplacement' y' appendTail'. Muchas gracias. – NawaMan

1

Usted puede escribir usted mismo con bastante facilidad. Aquí está cómo:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class TestRegEx { 

    static public interface MatchProcessor { 
     public String processMatch(final String $Match); 
    } 
    static public String Replace(final String $Str, final String $RegEx, final MatchProcessor $Processor) { 
     final Pattern  aPattern = Pattern.compile($RegEx); 
     final Matcher  aMatcher = aPattern.matcher($Str); 
     final StringBuffer aResult = new StringBuffer(); 

     while(aMatcher.find()) { 
      final String aMatch  = aMatcher.group(0); 
      final String aReplacement = $Processor.processMatch(aMatch); 
      aMatcher.appendReplacement(aResult, aReplacement); 
     } 

     final String aReplaced = aMatcher.appendTail(aResult).toString(); 
     return aReplaced; 
    } 

    static public void main(final String ... $Args) { 
     final String aOriginal = "A xx1 B xx2 C xx3 D"; 
     final String aRegEx = "xx\\d"; 
     final String aReplaced = Replace(aOriginal, aRegEx, new MatchProcessor() { 
      public String processMatch(final String $Match) { 
       int num = Integer.parseInt($Match.substring(2)); 
       return ""+(num*num); 
      } 
     }); 

     System.out.println(aReplaced); 
    } 
}

Espero que esto ayude.

+0

De hecho, eso es bueno. ¡Gracias! :) – glmxndr

Cuestiones relacionadas