web-dev-qa-db-fra.com

Vérification qu'une chaîne ne contient que des lettres en C #

J'ai une chaîne d'entrée et je veux vérifier qu'elle contient:

  • Seulement des lettres ou
  • Seulement des lettres et des chiffres ou
  • Seulement des lettres, des chiffres ou des traits de soulignement

Pour clarifier, j'ai 3 cas différents dans le code, chacun appelant à une validation différente. Quel est le moyen le plus simple d'y parvenir en C #?

170
Bab Yogoo

Seulement des lettres:

Regex.IsMatch(input, @"^[a-zA-Z]+$");

Seulement des lettres et des chiffres:

Regex.IsMatch(input, @"^[a-zA-Z0-9]+$");

Seulement des lettres, des chiffres et des traits de soulignement:

Regex.IsMatch(input, @"^[a-zA-Z0-9_]+$");
265
Philippe Leybaert
bool result = input.All(Char.IsLetter);

bool result = input.All(Char.IsLetterOrDigit);

bool result = input.All(c=>Char.IsLetterOrDigit(c) || c=='_');
221
Muhammad Hasan Khan

Lettres seulement:

Regex.IsMatch(theString, @"^[\p{L}]+$");

Lettres et chiffres:

Regex.IsMatch(theString, @"^[\p{L}\p{N}]+$");

Lettres, chiffres et tirets bas:

Regex.IsMatch(theString, @"^[\w]+$");

Notez que ces modèles correspondent également aux caractères internationaux (par opposition à l'utilisation de la construction a-z).

45
Fredrik Mörk

Pour ceux d'entre vous qui préfèrent ne pas aller avec Regex et sont sur le .NET 2.0 Framework (AKA no LINQ):

Seulement lettres:

public static bool IsAllLetters(string s)
{
    foreach (char c in s)
    {
        if (!Char.IsLetter(c))
            return false;
    }
    return true;
}

seulement des nombres:

    public static bool IsAllDigits(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsDigit(c))
                return false;
        }
        return true;
    }

niquement des chiffres ou des lettres:

    public static bool IsAllLettersOrDigits(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsLetterOrDigit(c))
                return false;
        }
        return true;
    }

niquement des chiffres ou des lettres ou des caractères soulignés:

    public static bool IsAllLettersOrDigitsOrUnderscores(string s)
    {
        foreach (char c in s)
        {
            if (!Char.IsLetterOrDigit(c) && c != '_')
                return false;
        }
        return true;
    }
19
ROFLwTIME

Je pense que c'est un bon cas d'utiliser des expressions régulières:

public bool IsAlpha(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z]+$");
}

public bool IsAlphaNumeric(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z0-9]+$");
}

public bool IsAlphaNumericWithUnderscore(string input)
{
    return Regex.IsMatch(input, "^[a-zA-Z0-9_]+$");
}
8
CMS

Vous pouvez effectuer une boucle sur les caractères de chaîne et vérifier à l'aide de la méthode Char IsLetter mais vous pouvez également faire une astuce à l'aide de la méthode String IndexOfAny pour rechercher d'autres caractères qui ne sont pas supposés l'être. dans la ficelle.

4
Baget

Si vous êtes un débutant, vous pouvez utiliser la référence de mon code. Ce que j'ai fait est de mettre un chèque pour que je ne puisse obtenir que les alphabets et les espaces blancs! Vous pouvez répéter la boucle for après la deuxième instruction if pour valider à nouveau la chaîne.

       bool check = false;

       Console.WriteLine("Please Enter the Name");
       name=Console.ReadLine();

       for (int i = 0; i < name.Length; i++)
       {
           if (name[i]>='a' && name[i]<='z' || name[i]==' ')
           {
               check = true;
           }
           else
           {
               check = false;
           }

       }

       if (check==false)
       {
           Console.WriteLine("Enter Valid Value");
           name = Console.ReadLine();
       }
1
Khyzar Ishaq Kapoor

Parcourez les caractères des chaînes et utilisez les fonctions de 'Char' appelées 'IsLetter' et 'IsDigit'.

Si vous avez besoin de quelque chose de plus spécifique, utilisez la classe Regex.

1
Arnis Lapsa

Récemment, j'ai amélioré les performances d'une fonction qui vérifie les lettres d'une chaîne à l'aide de cette page.

J'ai découvert que les solutions avec regex sont 30 fois plus lentes que celles avec la vérification Char.IsLetterOrDigit.

Nous n'étions pas sûrs que ces lettres ou chiffres incluaient et nous n'avions besoin que de caractères latins. Nous avons donc implémenté notre fonction sur la version décompilée de la fonction Char.IsLetterOrDigit.

Voici notre solution:

internal static bool CheckAllowedChars(char uc)
    {
        switch (uc)
        {
            case '-':
            case '.':
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                return true;
            default:
                return false;
        }
    }

Et l'utilisation est comme ça:

 if( logicalId.All(c => CheckAllowedChars(c)))
 { // Do your stuff here.. }
0
Aytaç Utku TOPAL

Veuillez trouver la méthode pour valider si le caractère est une lettre, un chiffre ou un espace, sinon attachez un trait de soulignement (soyez libre de le modifier selon vos besoins)

public String CleanStringToLettersNumbers(String data)
{
    var result = String.Empty;

    foreach (var item in data)
    {
        var c = '_';

        if ((int)item >= 97 && (int)item <= 122 ||
            (int)item >= 65 && (int)item <= 90 ||
            (int)item >= 48 && (int)item <= 57 ||
            (int)item == 32)
        {
            c = item;
        }

        result = result + c;
    }

    return result;
}
0
Alfred Rojas