2010-02-05 14 views
5

Lassen Sie uns sagen, dass ich die folgende Zeichenfolge haben:Java: ersetzen regexp mit verarbeitetem Spiel

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

Ich möchte das Ergebnis:

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

Ich mag es wäre eine Möglichkeit, die meisten ähnlich zu tun:

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

Das heißt, einen String-Prozessor verwenden, der den übereinstimmenden Teilstring vor dem eigentlichen Ersetzen ändert.

Wurde bereits eine Bibliothek geschrieben, um dies zu erreichen?

Antwort

7

Verwendung 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

Großartig, wirklich diese Methode übersehen! Danke vielmals. – glmxndr

+0

Ich wusste nicht über 'appendReplacement' und' appendTail'. Danke vielmals. – NawaMan

1

Sie können sich ganz einfach schreiben. Hier ist wie:

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); 
    } 
}

Hoffe das hilft.

+0

In der Tat, das ist schön. Vielen Dank! :) – glmxndr