java - 正则表达式替换为匹配的计数

标签 java regex

我想用匹配项的编号/索引替换匹配项。

在 java 正则表达式风格中有没有办法知道当前匹配项是哪个匹配项编号,以便我可以使用 String.replaceAll(regex, replacement)

示例:用自身及其索引替换 [A-Z]:

Input:  fooXbarYfooZ
Output: fooX1barY2fooZ3

即,这个调用:

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

应该返回 "fooX1barY2fooZ3"


注意:我正在寻找可以执行此操作的替换字符串(如果存在的话)。


请不要提供涉及循环或类似代码的答案。


编辑:

我会接受最优雅的答案(即使它使用循环)。当前没有答案
实际工作。

最佳答案

需要遍历输入字符串,因此不可避免地会以一种或另一种方式循环。标准 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

关于java - 正则表达式替换为匹配的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10892276/

相关文章:

java - 从 double 中截断 0

java - 如何通过 Java 以编程方式在 116i 上使用 BMW JSDK 限制速度?

PHP preg_replace() 对多个项目

javascript - 正则表达式查找模式并仅替换其中的一部分

javascript - 正则表达式拆分字符串 'DB415.DBD21.3'

java - 安装多个后端镜像时出现 docker 错误

java - Flink 左外连接 : Enriching a Stream with Data from a csv file

java - 如何调试第三方Intellij IDEA插件?

regex - 用于验证名称和姓氏的正则表达式?

Javascript 正则表达式与匹配