我应该制作一个自定义装饰器,这样我就可以替换来自控制台和文件的输入:
- 一组具有特定字符的字符(例如
char[] x = {'a', 'b'}
和char y = '*'
,所以a
和b
都变成了*
- 一组字符和另一组成对的字符(例如
char[] x = {'a', 'b'}
和char[] y = {'c', 'd'}
,所以a
变成c
而b
变成d
最好的方法是什么?我用正则表达式创建了第一个( String replaceAll = s.replaceAll("(a|b)", String.valueOf(replacement));
),但这对第二种情况。有没有办法在一个正则表达式中制作第二种情况?我应该做一个 HashMap 吗?
最佳答案
首先在替换字符与其替换字符之间创建某种映射会更容易。我的意思是像
Map<String, String> map = new HashMap<>();
map.put("a", "c");
map.put("b", "d");
然后你可以使用appendReplacement
和 appendTail
来自 Matcher 类以替换匹配的字符。决定如何替换字符可以像 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);
关于Java:用其他不同的字符替换一组字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23174984/