Java: заменить регулярное выражение на обработанное совпадение - PullRequest
5 голосов
/ 05 февраля 2010

Допустим, у меня есть следующая строка:

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

То есть, используя строковый процессор, который изменяет соответствующую подстроку перед фактической заменой.

Есть ли какая-то библиотека, уже написанная для достижения этой цели?

Ответы [ 2 ]

7 голосов
/ 05 февраля 2010

Использование 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());
1 голос
/ 05 февраля 2010

Вы можете написать себя довольно легко. Вот как:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...