字符串不替换字符

yam*_*ams 77 java string replace

我有一个以字符串形式传入的句子,我正在对"和"这个词进行替换,我想用""替换它.它并没有用空格替换"和"这个词.以下是我的逻辑示例.当我调试它时,逻辑确实属于sentence.replace.

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

这里有什么我想念的东西.

Jon*_*eet 166

当我调试它时,逻辑确实属于sentence.replace.

是的,然后您丢弃返回值.

Java中的字符串是不可变的 - 当您调用时replace,它不会更改现有字符串的内容- 它会返回带有修改的字符串.所以你要:

sentence = sentence.replace("and", " ");
Run Code Online (Sandbox Code Playgroud)

这适用于所有的字符串(方法substring,toLowerCase等等).它们都没有改变字符串的内容.

请注意,您并不需要在某种情况下执行此操作 - 毕竟,如果该句子包含"and",则执行替换不会造成任何损害:

String sentence = "Define, Measure, Analyze, Design and Verify";
sentence = sentence.replace("and", " ");
Run Code Online (Sandbox Code Playgroud)

  • @MattBall:正如经常发生的那样,我发现给出一个好的,完整的答案比找到一个**也有一个好答案的副本更快.我相信(有点自负,不可否认)我的回答比你找到的副本中的被接受的更好,这甚至没有真正的技术意义.("你需要让你的字符串实际上等于你对字符串所做的更改" - 什么?)另外,我想指出不需要先检查包含的方面. (20认同)
  • 我必须叫你出去回复而不是投票结束.这个问题之前已被多次询问和回答 - 这是什么交易,乔恩? (2认同)
  • @MattBall虽然同意这个问题被反复询问,但我认为这是一个更好的答案,IHMO (2认同)

Kum*_*tra 68

字符串是不可变的,意味着它们的内容不能改变.当你打电话给replace(this,that)你时,你会得到一个全新的字符串.如果要保留此新副本,则需要将其分配给变量.您可以覆盖旧引用(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);

    }
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,请注意我已经删除了contains()支票,因为这是一个不必要的电话.如果它不包含它,则替换将无法进行任何替换.如果要替换的内容与您正在检查的实际条件不同,则只需要包含方法.

  • 这个答案的文本暗示它是导致问题的`contains()`调用 - 事实并非如此.这是一个不必要的电话,但实际上并没有引起任何问题.问题是由于忽略了`replace`的返回值,答案中根本没有解释. (41认同)
  • @corsiKa:老实说,我不会这样做是为了对其他人的现有答案进行编辑.它非常显着地改变了答案的含义. (3认同)

pb2*_*b2q 9

你没有做任何有关返回值的事情replace.您需要分配方法的结果,这是新的String:

sentence = sentence.replace("and", " ");
Run Code Online (Sandbox Code Playgroud)

A String在java中是不可变的.方法就像replace返回一个新的String.

您的contains测试是不必要的:replace如果没有要替换的文本实例,则只会禁止操作.


Ósc*_*pez 8

您应该重新分配替换的结果,如下所示:

 sentence = sentence.replace("and", " ");
Run Code Online (Sandbox Code Playgroud)

要注意的是,String类是不可变的,这意味着所有的它的方法返回一个新字符串,但不会改变就地原始字符串,所以在一个实例调用方法的结果String必须分配给一个变量或立即使用的改变生效.

  • @MarkBasler:嗯,你在说什么错,究竟是什么?如果你知道字符串是不可变的,那么你不清楚为什么你希望你的代码能够工作...... (3认同)