我想用匹配的数字/索引替换匹配.
在java正则表达式中有没有办法知道当前匹配的是哪个匹配号,所以我可以使用String.replaceAll(regex, replacement)?
示例:替换[A-Z]为自身及其索引:
Input: fooXbarYfooZ
Output: fooX1barY2fooZ3
Run Code Online (Sandbox Code Playgroud)
即,这个电话:
"fooXbarXfooX".replaceAll("[A-Z]", "$0<some reference to the match count>");
Run Code Online (Sandbox Code Playgroud)
应该回来 "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();
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
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"));
}
Run Code Online (Sandbox Code Playgroud)
输出:
fooX1barX2fooX3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5475 次 |
| 最近记录: |