如何替换一个或多个子字符串是其他子字符串一部分的多个子字符串?



我有一个包含"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

相关内容

  • 没有找到相关文章

最新更新