首先在替换字符和它的替换字符之间创建某种映射会更容易。我的意思是像
Map<String, String> map = new HashMap<>();
map.put("a", "c");
map.put("b", "d");
那么您可以使用 Matcher 类中的 appendReplacement 和 appendTail 来替换匹配的字符。可以像map.get(matchedCharacter) 一样决定如何获取替换字符。
简单演示
Map<String, String> map = new HashMap<>();
map.put("a", "c");
map.put("b", "d");
String demo = "abcdef";
Pattern p = Pattern.compile("[ab]");
Matcher m = p.matcher(demo);
StringBuffer sb = new StringBuffer();
while (m.find()){
m.appendReplacement(sb, map.get(m.group()));
}
m.appendTail(sb);
String replaced = sb.toString();
System.out.println(replaced);
输出:cdcdef
Java 9 及更高版本更新
在下面的模板中,我们通常只更改一件事,即决定使用什么来替换已建立的匹配。
StringBuffer sb = new StringBuffer();
while (m.find()){
m.appendReplacement(sb, /* decision about replacement*/ );
// ^^^^^^^^^^^^^^^^^^^^^^^^^^
}
m.appendTail(sb);
String replaced = sb.toString();
因此,由于该逻辑的其余部分是重复的,因此该模板被包装为String replaceAll(Function<MatchResult,String> replacer),这要求我们提供获取已建立匹配替换的逻辑。所以上面的代码可以简化为:
Map<String, String> map = new HashMap<>();
map.put("a", "c");
map.put("b", "d");
String demo = "abcdef";
Pattern p = Pattern.compile("[ab]");
Matcher m = p.matcher(demo);
String replaced = m.replaceAll(match -> map.get(match.group()));
System.out.println(replaced);