2010-02-05 24 views
5

ı aşağıdaki dizeyi var diyelim:Java: İşlenmiş maçı ile regexp yerine

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

o en andıran bir şekilde yapmak için:
String in = "A xx1 B xx2 C xx3 D"; 

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

Gerçek değiştirme işleminden önce, eşleşen alt dizgiyi değiştiren bir dize işlemcisi kullanmak.

Bunu başarmak için önceden yazılmış bir kütüphane var mı?

cevap

7

Kullanım 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

Harika, gerçekten bu yöntemi gözden kaçırdı! Bir ton teşekkürler. – glmxndr

+0

“appendReplacement” ve “appendTail” hakkında bir şey bilmiyordum. Çok teşekkürler. – NawaMan

1

Sen oldukça kolay kendiniz yazabilir. İşte bu nasıl olur:

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

Bu yardımcı olur umarım.

+0

Gerçekten, bu güzel. Teşekkürler! :) – glmxndr