web-dev-qa-db-fra.com

La méthode de remplacement de chaîne ne remplace pas les caractères

J'ai une phrase qui est passée en tant que chaîne et je fais un remplacement sur le mot "et" et je veux le remplacer par "". Et cela ne remplace pas le mot "et" par un espace. Voici un exemple de ma logique. Et lorsque je corrige cela, la logique tombe dans la phrase.

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

Y a-t-il quelque chose qui me manque ici?.

77
yams

Et lorsque je corrige cela, la logique tombe dans la phrase.

Oui, puis vous supprimez la valeur de retour.

Les chaînes dans Java sont immuables. Lorsque vous appelez replace, le contenu de la chaîne existante ne change pas. - il retourne une nouvelle chaîne avec les modifications. Alors vous voulez:

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

Ceci s'applique à toutes les méthodes en chaîne (substring, toLowerCase etc). Aucun ne modifie le contenu de la chaîne.

Notez que vous n'avez pas vraiment besoin de faire cela dans une condition - après tout, si la phrase ne contient pas contient "and", elle ne nuit pas à effectuer le remplacement:

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

Les chaînes sont immuable, ce qui signifie que leur contenu ne peut pas changer. Lorsque vous appelez replace(this,that), vous vous retrouvez avec une toute nouvelle chaîne. Si vous souhaitez conserver cette nouvelle copie, vous devez l'affecter à une variable. Vous pouvez écraser l'ancienne référence (à la sentence = sentence.replace(this,that) ou une nouvelle référence, comme indiqué ci-dessous:

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);

    }
}

En passant, notez que j'ai enlevé la coche contains(), car c'est un appel inutile ici. S'il ne le contient pas, le remplacement échouera simplement. Vous voudriez seulement que la méthode contient si ce que vous remplacez était différent de la condition réelle que vous vérifiez.

68

Vous ne faites rien avec la valeur de retour de replace. Vous devrez assigner le résultat de la méthode, qui est le nouveau String:

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

Un String est immuable en Java. Des méthodes comme replace renvoient un nouveau String.

Votre test contains n'est pas nécessaire: replace ne fonctionnera tout simplement pas s'il existe ne sont pas occurrences du texte à remplacer.

9
pb2q

Vous devriez réaffecter le résultat du remplacement, comme ceci:

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

Sachez que la classe String est immuable , ce qui signifie que toutes de ses méthodes renvoient une nouvelle chaîne et jamais modifier la chaîne d'origine sur place, de sorte que le résultat de l'appel d'une méthode dans une instance de String doit être affecté à une variable ou utilisé immédiatement pour que la modification soit prise en compte.

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