如何在 Java 中一次替换字符串中的多个单词?

How do you replace multiple words in a string at once in Java?

我是 Java 的新手,我正在尝试制作一个程序,该程序将采用字符串 'names' 并将该字符串中提到的人名替换为另一个字符串中的昵称 'replacement'。例如,“约翰和罗伯特在去见伊丽莎白的路上”应该 return“乔和鲍勃在去见丽兹的路上”。

我的问题是,每当我 运行 我的程序时,我都会返回多个句子,每个句子只替换一个名字(我猜它每次都会创建一个新字符串)。有没有办法避免这种情况并将其全部打印在一句话中?我可以在 'replacement' 上使用正则表达式以某种方式修复它吗?

public static string namereplacer(String names, String replacement) {
    String[] toreplace = replacement.split("\t|\n");
    for (int i = 0; i <= toreplace.length/2; i++) {
        if (i % 2 == 0) { //take even values
        fixed; += names.replaceAll(toreplace[i+1],toreplace[i]);
        }
    }
    return fixed;
}

public static void main (String[] args) {
    namereplacer("John and Robert were on the way to meet Elizabeth", "John\tJoe\nRobert\tBob\nElizabeth\tLiz");
}

把方法namereplacer改成这个

public static String namereplacer(String names, String replacement) {
    String[] toreplace = replacement.split("\n");
    for(String str: toreplace){
        String [] keyValue = str.split("\t");
        if(keyValue.length != 2)
            continue;
        names = names.replaceAll(keyValue[0], keyValue[1]);
    }
    return names;
}

我无法 运行 你提交的代码,因为变量 fixed 没有声明,我怀疑行
fixed; += names.replaceAll(toreplace[i+1],toreplace[i]);
应该是
fixed += names.replaceAll(toreplace[i+1],toreplace[i]);
因为这在某种程度上可以解释为什么你会得到多个句子,因为你要多次替换东西并将结果添加到 fixed.

话虽如此,我注意到当您将名称替换为 names.replaceAll(toreplace[i+1],toreplace[i]); 你应该做的 names.replaceAll(toreplace[i],toreplace[i+1]); 因为您想用 John 代替 Joe,用 Robert 代替 Bob,用 Elizabeth 代替 Liz,而不是反过来(Joe 代替 John)。基本上你想用“奇数”替换“偶数”,所以如果你选择 i 的偶数值,你想用 i+1.

替换它们

同样在 for 循环中用
迭代数组时 for (int i = 0; i <= toreplace.length/2; i++)
你应该做
for (int i = 0; i <= toreplace.length; i++)
因为你想要所有的“偶数”而不仅仅是其中的一半,我想你可能已经在这里用偶数逻辑改变了自己并替换了一半...

因此,为了使您的代码按预期工作,您应该替换以下行:
for (int i = 0; i <= toreplace.length/2; i++) 对于
for (int i = 0; i <= toreplace.length; i++)

fixed; += names.replaceAll(toreplace[i+1],toreplace[i]); 对于
fixed = fixed.replaceAll(toreplace[i+1],toreplace[i]);

并预先定义固定的变量Sting fixed = names;,使其具有与names相同的值。

此外,您还可以稍微改进一下代码:
一个for由三个语句for(statement1; statement2; stament3)
构成 statement1在代码块之前执行一次(for里面的内容)
statement2 定义执行代码块的条件,for 将 运行 while this statement is true
statement3 每次代码块被 for 循环执行后执行

通常你会发现并编写像 for(i=0; i!=foo; i++) 这样的 foor 循环,其中 statement1 用于变量初始化,statement2 用于条件,statement3 用于增量,但这并不意味着你可以用它做所有事情,实际上,您可以在这些语句中写任何内容 want/need。
在你的情况下你有

for (int i = 0; i <= toreplace.length/2; i++) {
        if (i % 2 == 0) { //take even values
        fixed; += names.replaceAll(toreplace[i+1],toreplace[i]);
        }
    } 

这意味着您正在遍历 toreplace 数组,在 fixed 字符串中获取“evens”并将其替换为“odds”,但是在 for 循环中您只选择你用 if (i % 2 == 0) 进行的迭代的一半,你真的不需要这样做,因为你可以选择迭代 2,而不是迭代所有的迭代,只选择其中的一半来进行替换。
要做到这一点,您只需声明 for (int i = 0; i != toreplace.length; i+=2) 或长途方式 i=i+2(如果您愿意),并且您不再需要 if 语句,因为您知道您将遍历所有偶数。
希望这对您有所帮助。