我想修改字符串中的两个字符,例如将每个'i'
更改为'e'
,并将每个'e'
更改为'i'
,使文本为"This is a test"
将成为"Thes es a tist"
。
我已经提出了一种可行的解决方案,但是它很无聊而且很优雅:
String input = "This is a test";
char a = 'i';
char b = 'e';
char[] chars = input.toCharArray();
for(int i = 0; i < chars.length; i++) {
if(chars[i] == a) {
chars[i] = b;
}else if(chars[i] == b) {
chars[i] = a;
}
}
input = new String(chars);
如何用正则表达式来实现?
答案 0 :(得分:5)
自Java 9开始,我们可以使用Matcher#replaceAll(Function<MatchResult,String>)
。因此,您可以创建正则表达式来搜索i
或e
,并在找到时让函数根据找到的值(例如从地图中)选择替换项
演示
Map<String, String> replacements = Map.ofEntries(
Map.entry("i", "e"),
Map.entry("e", "i")
);
String replaced = Pattern.compile("[ie]")
.matcher(yourString)
.replaceAll((match) -> replacements.get(match.group()));
但是,老实说,您的解决方案看起来并不糟糕,尤其是当它用于搜索单个字符时。
答案 1 :(得分:2)
比Pschemo的解决方案优雅的解决方案,但自Java 8起可用:
static String swap(String source, String a, String b) {
// TODO null/empty checks and length checks on a/b
return Arrays
// streams single characters as strings
.stream(source.split(""))
// maps characters to their replacement if applicable
.map(s -> {
if (s.equals(a)) {
return b;
}
else if (s.equals(b)) {
return a;
}
else {
return s;
}
})
// rejoins as single string
.collect(Collectors.joining());
}
在"This is a test"
上调用,它返回:
Thes es a tist
注意
正如其他人所提到的,您的解决方案和单个字符一样好。