242 votes

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

J'ai une chaîne de caractères en entrée et je veux vérifier qu'elle contient :

  • Seules les lettres ou
  • Seuls les lettres et les chiffres ou
  • Uniquement 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# ?

0 votes

RegEx est plus lent qu'une vérification directe des caractères. Vous pouvez écrire une méthode d'extension ou en utiliser une qui est déjà écrite, comme la méthode Extensions.cs Un paquet NuGet qui rend les choses aussi simples que possible : Par exemple : "abcXYZ".IsAlphabetic() retournera True alors que "abc123".IsAlphabetic() retournera False.

361voto

Philippe Leybaert Points 62715

Seulement des lettres :

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

Seulement des lettres et des chiffres :

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

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

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

37 votes

Cela suppose un alphabet latin, alors que Char.IsLetter permet les alphabets non-latins.

7 votes

Regex.IsMatch(input, "^[a-z0-9]+$", RegexOptions.IgnoreCase) ;

4 votes

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

311voto

Hasan Khan Points 20723
bool result = input.All(Char.IsLetter);

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

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

7 votes

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

10 votes

@nam En effectuant un test par rapport au dictionnaire de prononciation de la CMU (toutes les lettres uniquement, longueur moyenne de 7,4 caractères), la vitesse est de 1,8 fois supérieure à celle de la version compilée. Regex pour toutes les lettres, et 3x plus rapide que le compilé Regex pour toutes les lettres avec IgnoreCase option ( !).

2 votes

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

55voto

Fredrik Mörk Points 85694

Lettres seulement :

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

Lettres et chiffres :

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

Lettres, chiffres et traits de soulignement :

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

Notez que ces motifs correspondent également aux caractères internationaux (contrairement à l'utilisation de la fonction a-z construire).

26voto

ROFLwTIME Points 2223

Pour ceux d'entre vous qui préfèrent ne pas utiliser Regex et qui utilisent le cadre .NET 2.0 (donc pas de LINQ) :

Seulement des lettres :

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

Seulement des 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 caractères de soulignement :

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

9voto

CMS Points 315406

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 votes

Regex dispose de méthodes statiques pour cela

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