21

一致を一致の番号/インデックスに置き換えたいと思います。

Java正規表現フレーバーで、現在の一致がどの一致番号であるかを知る方法があるので、使用できますString.replaceAll(regex, replacement)か?

[A-Z]例:それ自体とそのインデックスに置き換えます。

Input:  fooXbarYfooZ
Output: fooX1barY2fooZ3

つまり、この呼び出し:

"fooXbarXfooX".replaceAll("[A-Z]", "$0<some reference to the match count>");

戻るべき"fooX1barY2fooZ3"


注:存在する場合は、これを実行できる代替文字列を探しています。


ループや同様のコードを含む回答は提供しないでください。


編集:

機能する最もエレガントな答えを受け入れます(ループを使用している場合でも)。現在の回答
は実際には機能しません。

4

4 に答える 4

6

入力文字列を反復処理する必要があるため、いずれかの方法でループすることは避けられません。標準 API は、そのループを実装するメソッドを実装していないため、ループはクライアント コードまたはサード パーティのライブラリに存在する必要があります。


コードは次のようになります。

public abstract class MatchReplacer {

    private final Pattern pattern;

    public MatchReplacer(Pattern pattern) {
        this.pattern = pattern;
    }

    public abstract String replacement(MatchResult matchResult);

    public String replace(String input) {

        Matcher m = pattern.matcher(input);

        StringBuffer sb = new StringBuffer();

        while (m.find())
            m.appendReplacement(sb, replacement(m.toMatchResult()));

        m.appendTail(sb);

        return sb.toString();
    }
}

使用法:

public static void main(String... args) {
    MatchReplacer replacer = new MatchReplacer(Pattern.compile("[A-Z]")) {
        int i = 1;
        @Override public String replacement(MatchResult m) { 
            return "$0" + i++;
        }
    };
    System.out.println(replacer.replace("fooXbarXfooX"));
}

出力:

fooX1barX2fooX3
于 2012-06-05T06:06:16.723 に答える
4

Java 正規表現は一致数への参照をサポートしていないため、それは不可能です。

于 2012-12-21T18:45:42.423 に答える
3

Javaのループなしでは不可能です...

于 2012-06-05T06:14:10.760 に答える
3

Javaのループがなければ、それは不可能だと思います。

String x = "fooXbarXfooX";
        int count = 0;
        while(x.contains("X"))
        x = x.replaceFirst("X", Integer.toString(count++));
        System.out.println(x);
于 2012-06-05T06:16:20.410 に答える