Java 用更干净的字符串编码方式替换多个replaceAll
我需要在一个字符串中执行多个Java 用更干净的字符串编码方式替换多个replaceAll,java,android,Java,Android,我需要在一个字符串中执行多个replaceAll命令,我想知道是否有一种干净的方法来执行。目前情况如下: newString = oldString.replaceAll("α","a").replaceAll("β","b").replace("c","σ") /* This goes on for over 60 replacements*/; 你可以这样做。映射将包含映射,您所要做的就是循环映射并调用replace publicstaticvoidmain(字符串[]args){ //你
replaceAll
命令,我想知道是否有一种干净的方法来执行。目前情况如下:
newString = oldString.replaceAll("α","a").replaceAll("β","b").replace("c","σ") /* This goes on for over 60 replacements*/;
你可以这样做。映射将包含映射,您所要做的就是循环映射并调用
replace
publicstaticvoidmain(字符串[]args){
//你的意见
字符串old=“某物”;
//映射
Map mappings=newhashmap();
put('α','a');
//循环映射并执行操作
for(Map.Entry:mappings.entrySet()){
old=old.replace(entry.getKey(),entry.getValue());
}
}
如果您只想将单个字符
替换为单个字符
或另一个字符串
,我已经实施了一个专门的解决方案:
private static Map<Character, Character> REPLACEMENTS = new HashMap<>();
static {
REPLACEMENTS.put('α','a');
REPLACEMENTS.put('β','b');
}
public static String replaceChars(String input) {
StringBuilder sb = new StringBuilder(input.length());
for(int i = 0;i<input.length();++i) {
char currentChar = input.charAt(i);
sb.append(REPLACEMENTS.getOrDefault(currentChar, currentChar));
}
return sb.toString();
}
使用for循环执行此操作。有一个地图,其中键为希腊字母,值为拉丁等价物,并在其中循环并执行替换。因为,最后你仍然需要有映射才能知道哪个字母变为什么。你可以使用而不是
replaceAll
,因为你不使用正则表达式。或者您可以使用stringbuilder,这将减少您必须执行的副本数量。此方法是否也适用于替换字符序列?示例“abcd”到“e”。编辑:我刚才看到你提到这只适用于单个字符…不,正如我所解释的:替换多个输入字符需要更复杂的解决方案。我会把它添加到我的回答中。你手边有复杂的解决方案吗?因为我确实需要替换多个字符。我添加了扩展解决方案,最后一个问题。在我自己的行中,我使用了newString和oldString。代码中的哪些元素对应于它们?
private static Map<String, String> REPLACEMENTS = new HashMap<>();
static {
REPLACEMENTS.put("aa","AA");
REPLACEMENTS.put("bb","BB");
}
public static String replace(String input) {
StringBuilder sb = new StringBuilder(input.length());
for (int i = 0; i < input.length(); ++i) {
i += replaceFrom(input, i, sb);
}
return sb.toString();
}
private static int replaceFrom(String input, int startIndex, StringBuilder sb) {
for (Map.Entry<String, String> replacement : REPLACEMENTS.entrySet()) {
String toMatch = replacement.getKey();
if (input.startsWith(toMatch, startIndex)) {
sb.append(replacement.getValue());
//we matched the whole word skip all matched characters
//not just the first
return toMatch.length() - 1;
}
}
sb.append(input.charAt(startIndex));
return 0;
}