regex 正则表达式替换为匹配项的计数

a8jjtwal  于 2023-02-14  发布在  其他
关注(0)|答案(4)|浏览(100)

我想用匹配项的编号/索引替换匹配项。
java中有没有办法知道当前匹配的匹配号,这样我就可以只使用replaceAll(regex, replacement)将每个匹配的计数注入到结果中?
示例:将[A-Z]替换为它本身及其索引:

Input:  fooXbarYfooZ
Output: fooX1barY2fooZ3

例如:

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

应返回"fooX1barY2fooZ3"
注意:我在replaceAll()(或类似方法)的单个调用中寻找一个 replacement String,它完成了整个工作。
使用不止一个方法调用的答案,例如在for循环中 Package 替换操作,没有回答问题。

6ojccjat

6ojccjat1#

需要迭代输入字符串,因此循环是不可避免的。标准API没有实现实现该循环的方法,因此循环必须在客户端代码或第三方库中。
下面是代码的外观btw:

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
jecbmhm3

jecbmhm32#

在Java中没有循环是不可能的...

5uzkadbs

5uzkadbs3#

Java regex不支持对匹配计数的引用,因此这是不可能的。

ddarikpa

ddarikpa4#

我不认为在Java中没有任何循环是可能的。

String x = "fooXbarXfooX";
        int count = 0;
        while(x.contains("X"))
        x = x.replaceFirst("X", Integer.toString(count++));
        System.out.println(x);

相关问题