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

我想用匹配的数字/索引替换匹配。

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

示例:将[AZ]替换为自身及其索引:

 Input: fooXbarYfooZ Output: fooX1barY2fooZ3 

即,这个电话:

 "fooXbarXfooX".replaceAll("[AZ]", "$0"); 

应该返回"fooX1barY2fooZ3"

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

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

编辑:

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

需要迭代输入字符串,因此以某种方式循环是不可避免的。 标准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("[AZ]")) { int i = 1; @Override public String replacement(MatchResult m) { return "$0" + i++; } }; System.out.println(replacer.replace("fooXbarXfooX")); } 

输出:

 fooX1barX2fooX3 

没有Java中的循环是不可能的……

Java正则表达式不支持对匹配计数的引用,因此不可能。

好吧,我不认为没有任何Java循环可能。

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