web-dev-qa-db-fra.com

Vérifier si une chaîne ne contient qu'un ensemble de lettres

J'essaie de vérifier si un mot ne contient qu'un ensemble de lettres telles que I, O, S, H et X Supposons que l'utilisateur entre: SSHX, la sortie sera oui, mais si l'utilisateur entre SHEXX, la sortie sera NO

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String Word = sc.next();
    Word = Word.toUpperCase();

    int length = Word.length();
    char letter = 0;

    for (int counter = 0; counter < length; counter++) {
        letter = Word.charAt(counter);
    }
    if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') {
        System.out.print("NO");
    } else {
        System.out.print("YES");
    }
}
10
user1578012

Vous avez un bon moyen de le résoudre. Le problème est que vous ne vérifiez pas réellement chaque lettre, vous devez donc effectuer les vérifications à l'intérieur de la boucle for ou vous ne vérifierez que la dernière lettre. Mais alors vous ne pouvez pas imprimer le "OUI" car vous ne voulez l'imprimer que si TOUTES les lettres sont oui, vous pouvez donc utiliser une valeur booléenne pour vérifier cela aussi:

    boolean isMatch = true; 
    for (int counter = 0; counter < strLength && isMatch; counter++) {
        letter = Word.charAt(counter);
        if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') {
            System.out.print("NO");
            isMatch = false;
        } 
    }
    if (isMatch) {
        System.out.print("YES");
    }

Mais, comme d'autres l'ont souligné, l'utilisation d'une expression régulière est plus efficace (et celle-ci a une expression rationnelle fonctionnelle pour ce que vous voulez. L'astérisque signifie zéro ou plus de ce qui est entre crochets.):

    if (Word.matches("[HIOSX]*")) {
        System.out.print("YES");
    } else {
        System.out.print("NO");
    }
11
ddmps

Utilisez une expression régulière .

String regex = "[OSXHI]*";
String string = "SOMETHING";
Matcher matcher = Pattern.compile(regex).matcher(string);
if (matcher.find())
{
    String match = matcher.group(1);
    System.out.println(match);
}

Quelques ressources supplémentaires:

5
syb0rg

En plus de la réponse évidente consistant à utiliser une expression régulière, envisagez d'utiliser le code guava API de Google pour simplifier les choses:

if(CharMatcher.anyOf("HIOSX").matchesAllOf(Word)) { 

} ...
5
Amir Afghani

Utilisez une expression régulière:

if (Word.matches("[HIOSX]+"))
    System.out.println("YES");
else
    System.out.println("NO");
2
user207421

tout d’abord, vous devriez initialiser une lettre comme ceci: char letter = '0'; au lieu de 0 en second lieu votre boucle for est mal utilisée essayez ce code:

 boolean isInSet;
    for (int counter = 0; counter < strLength; counter++) 
    {
        letter = Word.charAt(counter);
        if (letter != 'I' && letter != 'O' && letter != 'S' && letter != 'H' && letter != 'Z' && letter != 'X' && letter != 'N') 
        {
            isInSet=false;
            counter=strlength; //end loop
        } 
        else 
        {
           isInSet=true;
        }
    }
    if(isInSet=true)
    {
       System.out.print("YES");
    }
    else
    {
       System.out.print("NO");
    }

Maintenant, la boucle boucle sur la chaîne et vérifie si chaque caractère est dans le jeu, si ce n'est pas le cas, la boucle se termine et le booléen est défini sur false, ce qui donne la sortie NO

0
rnm20