我有一个包含"sum"和"sumall"等单词的String
。我需要将"总和"替换为"B",将"总和"替换为"A"。为了方便起见,我将它们全部转换为大写,但是当我将它们全部替换时,首先将所有"总和"更改为"B",然后将所有"总和"更改为"A",然后我得到奇怪的结果。所有的"总和"都转换成"B",所有的"总和"都变成"球",这是我不想要的。如何正确更改它们?
首先将sumall
替换为A
,然后将sum
替换为B
。您可以将它们链接在一起,如下所示:
public class Main {
public static void main(String[] args) {
System.out.println("hello sumall hi sum. sumall and sum are different".replace("sumall", "A")
.replace("sum", "B").toUpperCase());
}
}
输出:
HELLO A HI B. A AND B ARE DIFFERENT
你有奇怪的结果,因为你以错误的顺序做。假设您的输入是
"苏莫尔和">
并且您希望输出
"阿乙">
现在,如果你首先用 B 替换 sum,那么你最终得到
"球B">
并且在已经损坏的String
中用 A 替换 sumall 无济于事.因此,假设您有一个包含需要替换为什么的对的String[][]
,那么您需要按一个进行排序,String
它是另一个的子字符串作为比较检查。
让我们使用比较器进行排序:
Collections.sort(yourInput, new Comparator<MyObject>() {
@Override
public int compare(String a, String b) {
if ((a == null) || (b == null) || (a.equals(b))) return 0;
if (a.indexOf(b) >= 0) return -1;
if (b.indexOf(a) >= 0) return 1;
return 0;
}
});
我想您问题中的替换只是说明错误的一个例子,您可能对也适用于其他替换的解决方案感兴趣。
正如您提到的,您想替换单词,只有当它们作为整个单词而不是其他单词中的子字符串出现时,您才可以使用正则表达式来匹配所需的替换(如果您确实需要处理子字符串,通用解决方案将涉及根据其通用前缀对所有替换进行排序)。
对于整个单词(单词对应于字母数字字符的任意序列),下面的代码应该有效:
final Map<String, String> replacements = Map.of(
"sum", "B",
"sumall", "A");
final String test = "hello sumall hi sum. sumall and sum are different";
String result = test;
for (var replacementEntry : replacements.entrySet()) {
result = result.replaceAll("([\W]+)" + Pattern.quote(replacementEntry.getKey()) + "([\W]+)",
"$1" + replacementEntry.getValue() + "$2");
}
System.out.println(result);
输出:
hello A hi B. A and B are different