5 votes

Comment remplacer un mot spécifique dans une chaîne de caractères

Comment puis-je remplacer un mot spécifique de la saisie de l'utilisateur et l'afficher comme un astérisque. Voici mon code.

String[] filteredWords = ["apple", "banana", "orange"];

private String convertWord(String input) {
    StringBuilder asterisk = new StringBuilder();
    for (String filter: filteredWords) {
        if (input.toLowerCase().contains(filter)) {
            for (int i = 0; i < filter.length(); i++) {
                asterisk.append("*");
            }
            input = input.replace(filter, asterisk.toString());
        }
    }

    return input;
}

Par exemple, si l'utilisateur saisit ou tape "Ceci est une pomme et non une orange", la sortie attendue sera "Ceci est ***** et non ******".

Mais mon problème ici est que lorsque l'utilisateur tape (avec une casse de caractères) "Ceci est Apple et non oRaNGE" ou "Ceci est aPpLe et non Orange", la sortie ne change pas. Les mots pomme et orange ne sont pas remplacés par un astérisque.

Toute aide est appréciée. Merci.

6voto

Tim Biegeleisen Points 53335

J'aime utiliser le remplacement regex ici, avec une alternance contenant tous vos termes de recherche :

String[] filteredWords = { "apple", "banana", "orange" };
String regex = "(?i)\\b(?:" + String.join("|", filteredWords) + ")\\b";

private String convertWord(String input) {
    input = input.replaceAll(regex, "*");
    return input;
}

convertWord("Apple watermelon ORANGE boot book pear banana");

Le résultat de l'appel de la méthode ci-dessus est :

* watermelon * boot book pear *

2voto

A y Points 21
String[] filteredWords = ["apple", "banana", "orange"];

private static String convertWord(String input) {
        StringBuilder asterisk = new StringBuilder();
        String inputInLower = input.toLowerCase();
        for (String filter: filteredWords) {
                if (inputInLower.contains(filter)) {
                    for (int i = 0; i < filter.length(); i++) {
                        asterisk.append("*");
                    }
                    inputInLower = inputInLower.replace(filter, asterisk.toString());
                    asterisk.setLength(0);
                }
            }
            return inputInLower;
        }

J'ai trouvé 2 problèmes dans votre code

  1. Vous utilisez la chaîne d'entrée qui n'est pas convertie en caractères inférieurs, donc la valeur du tableau ne correspond pas. Vous pouvez résoudre ce problème en utilisant une nouvelle variable comme je l'ai fait dans la réponse ou en convertissant les caractères inférieurs avant de les remplacer.
  2. Le deuxième problème est qu'avec StringBuilder, vous devez effacer le constructeur après chaque itération, sinon les derniers caractères seront ajoutés.

0voto

Pavel Maltsev Points 69

Je pense que le moyen le plus simple est d'ajouter dans le fichier xml une option permettant à l'utilisateur d'insérer uniquement des petits éléments, car si je comprends bien, vous ne vous occupez pas des éléments, vous travaillez avec des mots.

Alors comment faire, vous pouvez ajouter une ligne de poing en xml ou une ligne de code secondaire dans votre classe java.

android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

EditText userText = findViewById(R.id.userText);
String input;
input = userText.getText().toString();
input = input.toLowerCase();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X