如何以一个字符串最终不会替换另一个字符串的方式替换两个字符串?

2022-08-31 07:11:52

假设我有以下代码:

String word1 = "bar";
String word2 = "foo";
String story = "Once upon a time, there was a foo and a bar."
story = story.replace("foo", word1);
story = story.replace("bar", word2);

此代码运行后,的值将为story"Once upon a time, there was a foo and a foo."

如果我以相反的顺序替换它们,则会出现类似的问题:

String word1 = "bar";
String word2 = "foo";
String story = "Once upon a time, there was a foo and a bar."
story = story.replace("bar", word2);
story = story.replace("foo", word1);

的值将为story"Once upon a time, there was a bar and a bar."

我的目标是变成我如何做到这一点?story"Once upon a time, there was a bar and a foo."


答案 1

使用 Apache Commons StringUtils 中的 replaceEach() 方法:

StringUtils.replaceEach(story, new String[]{"foo", "bar"}, new String[]{"bar", "foo"})

答案 2

使用中间值(句子中尚不存在)。

story = story.replace("foo", "lala");
story = story.replace("bar", "foo");
story = story.replace("lala", "bar");

作为对批评的回应:如果你使用一个足够大的不常见的字符串,如zq515sqdqs5d5sq1dqs4d1q5dqqé“&é5d4sqjshsjddjhodfqsqc, nvùq^μù;d&€sdq: d: ;)àçàçlala 并使用它,那么我甚至不太可能争论用户是否会进入这个。知道用户是否会这样做的唯一方法是了解源代码,在这一点上,你还有另一个层次的担忧。

是的,也许有花哨的正则表达式方法。我更喜欢可读的东西,我知道也不会在我身上爆发。

还重申了康拉德@David在评论中给出的出色建议:

不要巧妙地(愚蠢地)使用一些字符串,选择不太可能。使用 Unicode 专用区域 U+E000 中的字符。U+F8FF.首先删除任何此类字符,因为它们不应该合法地存在于输入中(它们仅在某些应用程序中具有特定于应用程序的含义),然后在替换时将它们用作占位符。