Comment puis-je supprimer la ponctuation du texte d'entrée en Java?


J'essaie d'obtenir une phrase en utilisant l'entrée de l'utilisateur en Java, et je dois la rendre minuscule et supprimer toute ponctuation. Voici mon code:

    String[] words = instring.split("\\s+");
    for (int i = 0; i < words.length; i++) {
        words[i] = words[i].toLowerCase();
    }
    String[] wordsout = new String[50];
    Arrays.fill(wordsout,"");
    int e = 0;
    for (int i = 0; i < words.length; i++) {
        if (words[i] != "") {
            wordsout[e] = words[e];
            wordsout[e] = wordsout[e].replaceAll(" ", "");
            e++;
        }
    }
    return wordsout;

Je ne trouve aucun moyen de supprimer tous les caractères non-lettres. J'ai essayé d'utiliser des expressions régulières et des itérateurs sans chance. Merci pour toute aide.

Author: TheDoctor, 2013-09-16

5 answers

Cela supprime d'abord tous les caractères non-lettre, se plie en minuscules, puis divise l'entrée, faisant tout le travail en une seule ligne:

String[] words = instring.replaceAll("[^a-zA-Z ]", "").toLowerCase().split("\\s+");

Les espaces sont initialement laissés dans l'entrée afin que la division fonctionne toujours.

En supprimant les caractères de déchets avant le fractionnement, vous évitez d'avoir à parcourir les éléments en boucle.

 84
Author: Bohemian, 2013-09-17 14:06:24

Vous pouvez essayer ceci:-

Scanner scan = new Scanner(System.in);
System.out.println("Type a sentence and press enter.");
String input = scan.nextLine();
String strippedInput = input.replaceAll("\\W", "");
System.out.println("Your string: " + strippedInput);

[^\w] correspond à un caractère non-mot, de sorte que l'expression régulière ci-dessus correspondra et supprimera tous les caractères non-mot.

 3
Author: Rahul Tripathi, 2013-09-16 14:51:10

Si vous ne voulez pas utiliser RegEx (ce qui semble très inutile compte tenu de votre problème), vous devriez peut-être essayer quelque chose comme ceci:

public String modified(final String input){
    final StringBuilder builder = new StringBuilder();
    for(final char c : input.toCharArray())
        if(Character.isLetterOrDigit(c))
            builder.append(Character.isLowerCase(c) ? c : Character.toLowerCase(c));
    return builder.toString();
}

Il parcourt le char[] sous-jacent dans le String et ajoute uniquement le char s'il s'agit d'une lettre ou d'un chiffre (filtrant tous les symboles, ce que je suppose être ce que vous essayez d'accomplir), puis ajoute la version minuscule du char.

 3
Author: Josh M, 2013-09-16 14:53:21

Vous pouvez utiliser la construction d'expression régulière suivante

Ponctuation: L'un des !"#$%&'()*+,-./:;?@[]^_`{|}~

inputString.replaceAll("\\p{Punct}", "");
 2
Author: ravthiru, 2018-05-20 15:31:38

Je n'aime pas utiliser regex, alors voici une autre solution simple.

public String removePunctuations(String s) {
    String res = "";
    for (Character c : s.toCharArray()) {
        if(Character.isLetterOrDigit(c))
            res += c;
    }
    return res;
}

Remarque: Cela inclura à la fois des lettres et des chiffres

 -1
Author: Nerzid, 2016-09-27 22:08:37