如何解决你如何在 Java 中一次替换字符串中的多个单词?
我是 Java 新手,正在尝试制作一个程序,该程序将采用字符串 'names' 并将该字符串中提到的人的姓名替换为另一个字符串 '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");
}
解决方法
我无法运行您提交的代码,因为变量 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++)
因为你想要所有的“evens”而不仅仅是其中的一半,我想你可能已经用evens逻辑改变了自己并替换了一半......
所以为了让你的代码像你想要的那样工作,你应该替换以下几行: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]);
并且还预先定义了变量fixed Sting fixed = names;
,使其与names
具有相同的值。
此外,您还可以稍微改进您的代码:
一个 for
由三个语句 for(statement1; statement2; stament3)
statement1
在代码块之前执行一次(for 里面是什么)statement2
定义了执行代码块的条件,当这条语句为真时,for 将运行statement3
每次在 for 循环执行完代码块后执行
通常,您会找到并编写像 for(i=0; i!=foo; i++)
这样的 foo 循环,其中 statement1 用于变量初始化,statement2 用于条件,而 statement3 用于增量,但这并不意味着您可以用它做所有事情,实际上您可以在这些语句中写下您想要/需要的任何内容。
在你的情况下,你有
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
数组,取“evens”并将它们替换为 fixed
字符串上的“odds”,但是在 for 循环中您只选择了一半您正在使用 if (i % 2 == 0)
进行的迭代,您实际上并不需要这样做,因为您可以选择迭代 2,而不是迭代所有迭代并且只选择其中的一半进行替换。
为此,您只需声明 for (int i = 0; i != toreplace.length; i+=2)
或长路 i=i+2
(如果您愿意),并且您不再需要 if 语句,因为您知道将遍历所有偶数。
希望这对您有所帮助。
把方法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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。