Скажем, у меня есть следующая строка:
String in = "A xx1 B xx2 C xx3 D";
Я хочу результат:
String out = "A 1 B 4 C 9 D";
Я хотел бы сделать это способ напомнить большинство:
String out = in.replaceAll(in, "xx\\d",
new StringProcessor(){
public String process(String match){
int num = Integer.parseInt(match.replaceAll("x",""));
return ""+(num*num);
}
}
);
Таким образом, с помощью строкового процессора, который изменяет подобранную подстроку прежде, чем сделать фактическую замену.
Там некоторая библиотека уже записана для достижения этого?
Используйте 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());
Вы можете написать самому себе довольно легко. Вот как:
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);
}
}
Надеюсь, это поможет.