字符串替换方法不替换字符

我有一个以字符串形式传入的句子,我正在替换单词“ and”,我想用“”替换它。而且不是用空格代替“和”。下面是我的逻辑的一个例子。当我调试这个程序的时候,这个逻辑就会出现在这个句子中。

String sentence = "Define, Measure, Analyze, Design and Verify"
if (sentence.contains("and")){
sentence.replace("and", " ");
}

我是不是遗漏了什么。

441951 次浏览

当我调试这个程序的时候,这个逻辑就会出现在这个句子中。

是的,然后放弃返回值。

Java 中的字符串是不可变的-当您调用 replace时,它不会更改 存在字符串的内容-它返回一个经过修改的 新的字符串。所以你想要:

sentence = sentence.replace("and", " ");

这适用于 所有中的字符串方法(substringtoLowerCase等)。它们中的 没有改变了字符串的内容。

请注意,您实际上并不需要在某个条件下执行此操作——毕竟,如果句子 没有包含 "and",那么执行替换操作并无害处:

String sentence = "Define, Measure, Analyze, Design and Verify";
sentence = sentence.replace("and", " ");

您没有使用 replace的返回值进行任何操作。您将需要分配该方法的结果,即新的 String:

sentence = sentence.replace("and", " ");

String在 java 中是不可变的。像 replace这样的方法返回一个新的 String

您的 contains测试是不必要的: 如果有要替换的文本的 没有实例,那么 replace将不会运行。

你应该重新分配替换的结果,像这样:

 sentence = sentence.replace("and", " ");

请注意,String类是 永恒不变,这意味着它的方法的 所有返回一个新字符串,并且永远不会就地修改原来的字符串,因此在 String的实例中调用方法的结果必须分配给一个变量或立即使用,以使更改生效。

字符串是 永恒不变,这意味着它们的内容不能更改。当您调用 replace(this,that)时,您将得到一个全新的 String。如果希望保留这个新副本,则需要将其分配给一个变量。你可以覆盖旧的引用(a la sentence = sentence.replace(this,that)或一个新的引用,如下所示:

public class Test{


public static void main(String[] args) {


String sentence = "Define, Measure, Analyze, Design and Verify";


String replaced = sentence.replace("and", "");
System.out.println(replaced);


}
}

顺便说一句,请注意我已经删除了 contains()检查,因为它是一个不必要的调用。如果它没有包含它,那么替换程序将无法生成任何替换程序。只有当所替换的条件与所检查的实际条件不同时,才需要使用这个包含方法。

package com.tulu.ds;


public class EmailSecurity {
public static void main(String[] args) {
System.out.println(returnSecuredEmailID("sample717@gmail.com"));
}
private static String returnSecuredEmailID(String email){
String str=email.substring(1, email.lastIndexOf("@")-1);
return email.replaceAll(email.substring(1, email.lastIndexOf("@")-1),replacewith(str.length(),"*"));
}
private static String replacewith(int length,String replace) {
String finalStr="";
for(int i=0;i<length;i++){
finalStr+=replace;
}
return finalStr;
}
}