正则表达式替换为匹配的计数
我想用匹配的数字/索引替换匹配。
在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);