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


187

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 #?

Réponses:


292

Seulement des lettres:

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

Seulement des lettres et des chiffres:

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

Seuls les lettres, les chiffres et le trait de soulignement:

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

31
Cela suppose un alphabet latin, où Char.IsLetter autorise les alphabets non latins.
Paul van Brenk

5
Regex.IsMatch (entrée, "^ [a-z0-9] + $", RegexOptions.IgnoreCase);
Tom Fobear

4
@TomFobear: c'est plus lent que de spécifier explicitement [a-zA-Z]
Philippe Leybaert

25
Juste pour sauver des gens comme moi d'une autre recherche, Regex est dans l'espace de noms System.Text.RegularExpressions
Eric Barr

La réponse fournie par Muhammad Hasan Khan plus loin vaut également la peine d'être examinée. La comparaison de texte RegEx est lente.
twoleggedhorse il y a

243
bool result = input.All(Char.IsLetter);

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

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

5
Je serais curieux de savoir lequel le plus rapide est le vôtre (LINQ) ou celui de Philippe Leybaert (Regex)?
nam

5
@nam Exécution d'un test avec le dictionnaire de prononciation CMU (toutes les lettres seulement, longueur moyenne 7,4 caractères), c'est 1,8 fois plus rapide que compilé Regexpour toutes les lettres, et 3 fois plus rapide que compilé Regexpour toutes les lettres avec l' IgnoreCaseoption (!).
NetMage

1
La réponse acceptée utilise Regex non compilée, qui sera encore plus lente. Je préfère la solution LINQ, merci de l'avoir postée :)
Berend Engelbrecht

48

Lettres seulement:

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

Lettres et chiffres:

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

Lettres, chiffres et trait de soulignement:

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

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


19

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

Seulement des lettres:

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

Seulement les chiffres:

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

Seulement des chiffres ou des lettres:

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

Seulement des chiffres ou des lettres ou des traits de soulignement:

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

8

Je pense que c'est un bon cas pour utiliser les 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_]+$");
}

2
Regex a des méthodes statiques pour cela
Philippe Leybaert

4

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


1

Itérez les chaînes de caractères 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

Si vous êtes un débutant, vous pouvez prendre la référence de mon code .. ce que j'ai fait était de mettre un chèque afin que je ne puisse obtenir que les alphabets et les espaces blancs! Vous pouvez répéter la boucle for après la seconde 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;
               break;
           }

       }

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

0

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

J'ai compris 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 incluent et nous n'avions besoin que de caractères latins, nous avons donc implémenté notre fonction basée 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 ceci:

 if( logicalId.All(c => CheckAllowedChars(c)))
 { // Do your stuff here.. }

0

Veuillez trouver la méthode pour valider si char est une lettre, un chiffre ou un espace, sinon attachez un trait de soulignement (soyez libre de 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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.