我想用匹配的数字/索引替换匹配。
在java正则表达式中有没有办法知道当前匹配的是哪个匹配号,所以我可以使用String.replaceAll(regex, replacement)
?
示例:将[A-Z]
替换为自身及其索引:
Input: fooXbarYfooZ
Output: fooX1barY2fooZ3
即,这个电话:
"fooXbarXfooX".replaceAll("[A-Z]", "$0<some reference to the match count>");
应该返回"fooX1barY2fooZ3"
注意:我正在寻找可以执行此操作的替换字符串(如果存在)。
请不要提供涉及循环或类似代码的答案。
我会接受最优雅的答案(即使它使用循环)。目前没有答案
实际上工作。
答案 0 :(得分:7)
需要对输入字符串进行迭代,因此以某种方式循环是不可避免的。标准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
答案 1 :(得分:3)
在没有Java循环的情况下不可能......
答案 2 :(得分:3)
嗯,如果没有Java中的任何循环,我认为不可能。
String x = "fooXbarXfooX";
int count = 0;
while(x.contains("X"))
x = x.replaceFirst("X", Integer.toString(count++));
System.out.println(x);
答案 3 :(得分:3)
Java正则表达式不支持对匹配计数的引用,因此不可能。