web-dev-qa-db-ja.com

文字列が文字を置き替えない

私は文字列として渡される文を持っています、そして私は単語 "and"で置換をしています、そしてそれを ""で置換したいです。そしてそれは、単語 "and"を空白で置き換えるのではありません。以下は私の論理の例です。そして私がこれをデバッグするとき、論理は文.replaceに落ちます。

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

ここに足りないものがありますか。

77
yams

そして私がこれをデバッグするとき、論理は文.replaceに落ちます。

はい、そして戻り値を破棄します。

Javaの文字列は不変です - replaceを呼び出しても、existing文字列の内容は変更されません - 変更されたnew文字列が返されます。あなたが望んでいるのは:

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

これはall Stringのメソッド(substringtoLowerCaseなど)に適用されます。 なし文字列の内容を変更します。

あなたが本当に条件の中でこれをする必要はないことに注意してください - 結局のところ、ない"and"が含まれていても、置換を実行しても問題はありません。

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

文字列は不変で、内容は変更できません。 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);

    }
}

余談ですが、ここでは不要な呼び出しであるため、contains()チェックを削除しました。それが含まれていない場合は、置き換えは単に置き換えを行うことができなくなります。あなたが置き換えているものがあなたがチェックしている実際の状態と異なっていたならば、あなたはそれがメソッドを含むことを望むだけです。

68

戻り値replaceを使って何もしていません。メソッドの結果を代入する必要があります。それが新しいStringです。

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

StringはJavaでは不変です。 replaceのようなメソッドは新しいStringを返します。

あなたのcontainsテストは不要です。置換するテキストのインスタンスがない場合、replaceは何もしません。

9
pb2q

このように置き換えの結果を再割り当てする必要があります。

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

Stringクラスは immutable です。つまり、allメソッドは新しい文字列を返し、元の文字列は変更しません。インプレースなので、Stringのインスタンスでメソッドを呼び出した結果は、変数に代入するか、変更を有効にするために直ちに使用する必要があります。

8
Óscar López
package com.tulu.ds;

public class EmailSecurity {
    public static void main(String[] args) {
        System.out.println(returnSecuredEmailID("[email protected]"));
    }
    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;
    }   
}
0
Tulu