Comment puis-je valider une chaîne pour n'autoriser que les caractères alphanumériques?

117

Comment puis-je valider une chaîne à l'aide d'expressions régulières pour n'autoriser que les caractères alphanumériques?

(Je ne veux pas non plus autoriser d'espaces).

mrblah
la source

Réponses:

181

Utilisez l'expression suivante:

^[a-zA-Z0-9]*$

c'est à dire:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}
cletus
la source
Que diriez-vous en javascript, même chose je suppose?
mrblah le
4
Si vous nettoyez les noms de bases de données ou quelque chose d'interne comme celui-là, vous ne vous soucierez pas si cela ne fonctionne pas dans un pays anglophone.
Ognyan Dimitrov
15
Je déteste les expressions régulières. Je sais que je ne me souviendrai jamais de la syntaxe. Même si je l'étudie, il viendra bientôt un moment où tout sera de nouveau oublié.
Sentinel le
1
@Phil. Peut-être, mais d'ici là, je déléguerai à quelqu'un qui connaît les expressions régulières ;-)
Sentinel
3
Il a été dit, "si vous résolvez un problème en utilisant des expressions régulières, alors vous avez deux problèmes."
O. Jones
205

Dans .NET 4.0, vous pouvez utiliser LINQ:

if (yourText.All(char.IsLetterOrDigit))
{
    //just letters and digits.
}

yourText.Allarrêtera d'exécuter et retournera falseles premiers char.IsLetterOrDigitrapports de temps falsepuisque le contrat de Allne peut pas être exécuté alors.

Remarque! cette réponse ne vérifie pas strictement les alphanumériques (qui sont généralement AZ, az et 0-9). Cette réponse autorise les caractères locaux comme åäö.

Mise à jour 2018-01-29

La syntaxe ci-dessus ne fonctionne que lorsque vous utilisez une seule méthode qui a un seul argument du type correct (dans ce cas char).

Pour utiliser plusieurs conditions, vous devez écrire comme ceci:

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}
Jgauffin
la source
1
Je serais surpris que ce ne soit pas beaucoup plus rapide. Aucune regex à compiler ou à évaluer, juste une simple comparaison.
jgauffin
3
Maintenant, c'est tout simplement beau, clair et simple.
Sentinel le
3
Cela n'échouera-t-il pas si vous voulez vous assurer que votre texte est bien alphanumérique? Il peut s'agir de tous les chiffres ou de tous les alphabets, mais satisfait toujours à cette condition.
itsbalur
2
@itsbalur: Oui, mais ce n'était pas la question.
jgauffin le
2
Je pense que cette réponse est tout simplement fausse, en supposant que l'ensemble alphanumérique est AZ, az et 0-9 car cela couvre toute la gamme des lettres et des chiffres Unicode, y compris les caractères non latins. Par exemple, char.IsLetterOrDigit('ก')retournera true. csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
tia
34

Vous pouvez le faire facilement avec une fonction d'extension plutôt qu'une regex ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    for (int i = 0; i < str.Length; i++)
    {
        if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i]))))
            return false;
    }

    return true;
}

Par commentaire :) ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}
JP Alioto
la source
2
C'est peut-être une question de goût, mais j'exprimerais la boucle comme "foreach (char c in str) {...}". La question de savoir si une chaîne vide doit être considérée comme OK dépend de l'application, je retirerais donc cela. Je ne remplirais pas non plus 6 lignes vides dans une routine aussi triviale, mais je suppose que c'est du style C # / Java / C ++ - les codeurs semblent être payés par l'immobilier à l'écran. Quoi qu'il en soit, c'est la bonne direction, donc +1.
Svante
3
Je pense que nous voudrions utiliser IsDigit dans cette situation, plutôt que IsNumber - IsNumber retournera true pour les chiffres, ou pour les choses qui ressemblent à des nombres (fractions, chiffres romains, etc.; voir msdn.microsoft.com/ fr-fr / bibliothèque / yk2b3t2y.aspx ). Compte tenu de cela, et si on se sentait particulièrement mal, on pourrait encore compresser le contenu de IsAlphaNum: return string.IsNullOrEmpty (str)? false: str.ToCharArray (). All (Char.IsLetterOrDigit);
stack du
4
Notez que Char.IsLetter évaluera à vrai pour les «lettres» autres que a-zA-Z. Par exemple, le japonais あ, le chinois 的, le coréen 한, etc. sont considérés comme des «lettres» Unicode. Si telle est votre intention, alors très bien, mais à en juger par les diverses expressions regex dans les autres réponses, ce n'est probablement pas ce que la plupart considèrent comme alpha [numérique].
Dono
Dans mon cas, outre IsLetter et IsNumber, j'avais également besoin d'IsWhiteSpace, alors je l'ai ajouté à votre code et cela a parfaitement fonctionné!
Ben Junior
utilisez char.IsLetterOrDigitplutôt IsLetter + IsNumber
nick_n_a
17

Bien que je pense que la solution basée sur les regex est probablement la voie à suivre, je serais tenté de l'encapsuler dans un type.

public class AlphaNumericString
{
    public AlphaNumericString(string s)
    {
        Regex r = new Regex("^[a-zA-Z0-9]*$");
        if (r.IsMatch(s))
        {
            value = s;                
        }
        else
        {
            throw new ArgumentException("Only alphanumeric characters may be used");
        }
    }

    private string value;
    static public implicit operator string(AlphaNumericString s)
    {
        return s.value;
    }
}

Désormais, lorsque vous avez besoin d'une chaîne validée, vous pouvez faire en sorte que la signature de la méthode nécessite une AlphaNumericString, et sachez que si vous en obtenez une, elle est valide (à l'exception des valeurs nulles). Si quelqu'un tente de passer une chaîne non validée, cela générera une erreur du compilateur.

Vous pouvez devenir plus sophistiqué et implémenter tous les opérateurs d'égalité, ou un cast explicite en AlphaNumericString à partir d'une chaîne de caractères classique, si vous vous en souciez.

kyoryu
la source
Je n'ai jamais vu cette approche, mais j'aime la clarté de l'intention et votre justification. +1.
Cory House
1
C'est nouveau pour moi. J'essaie de comprendre la static public implicit operator stringpartie
Hassan Gulzar
8

J'avais besoin de vérifier AZ, az, 0-9; sans regex (même si l'OP demande une regex).

Mélange de diverses réponses et commentaires ici, et discussion de https://stackoverflow.com/a/9975693/292060 , cela teste la lettre ou le chiffre, évite les lettres d'autres langues et évite d'autres nombres tels que les fractions.

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}
bon oeil
la source
4

^\w+$ permettra a-zA-Z0-9_

Utilisez ^[a-zA-Z0-9]+$pour interdire le trait de soulignement.

Notez que les deux nécessitent que la chaîne ne soit pas vide. Utiliser *au lieu de +autorise les chaînes vides.

Peter Boughton
la source
comment pourrais-je changer votre ^ \ w + $ pour autoriser également le caractère "-" tiret?
Neal Davis
@NealDavis^[\w-]+$
Zachafer
2

Afin de vérifier si la chaîne est à la fois une combinaison de lettres et de chiffres, vous pouvez réécrire la réponse @jgauffin comme suit en utilisant .NET 4.0 et LINQ:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}
Thabiso Mofokeng
la source
Cela ne reconnaîtra pas correctement la chaîne contenant d'autres caractères avec alphanumérique ...
nsimeonov
1

Même réponse qu'ici .

Si vous voulez une A-z 0-9vérification ASCII non-regex , vous ne pouvez pas utiliser char.IsLetterOrDigit()car cela inclut d'autres caractères Unicode.

Ce que vous pouvez faire est de vérifier les plages de codes de caractères.

  • 48 -> 57 sont des nombres
  • 65 -> 90 sont des lettres majuscules
  • 97 -> 122 sont des lettres minuscules

Ce qui suit est un peu plus détaillé, mais c'est pour faciliter la compréhension plutôt que pour le code de golf.

    public static bool IsAsciiAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            return false;
        }

        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] < 48) // Numeric are 48 -> 57
            {
                return false;
            }

            if (str[i] > 57 && str[i] < 65) // Capitals are 65 -> 90
            {
                return false;
            }

            if (str[i] > 90 && str[i] < 97) // Lowers are 97 -> 122
            {
                return false;
            }

            if (str[i] > 122)
            {
                return false;
            }
        }

        return true;
    }
Douglas Gaskell
la source
0

Sur la base de la réponse de cletus, vous pouvez créer une nouvelle extension.

public static class StringExtensions
{        
    public static bool IsAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return false;

        Regex r = new Regex("^[a-zA-Z0-9]*$");
        return r.IsMatch(str);
    }
}
Alexa Adrian
la source
-8

Je conseille de ne pas dépendre du code prêt à l'emploi et intégré dans le framework .NET, essayez de proposer une nouvelle solution ... c'est ce que je fais.

public  bool isAlphaNumeric(string N)
{
    bool YesNumeric = false;
    bool YesAlpha = false;
    bool BothStatus = false;


    for (int i = 0; i < N.Length; i++)
    {
        if (char.IsLetter(N[i]) )
            YesAlpha=true;

        if (char.IsNumber(N[i]))
            YesNumeric = true;
    }

    if (YesAlpha==true && YesNumeric==true)
    {
        BothStatus = true;
    }
    else
    {
        BothStatus = false;
    }
    return BothStatus;
}
Mahdi Al Aradi
la source
2
Pourriez-vous s'il vous plaît ajouter quelques explications à votre code, le simple dumping de code est généralement mal vu ici
Draken
Ils ont également demandé des expressions régulières, ce ne sont pas des expressions régulières
Draken
Merci pour vos commentaires et observations ... comme je l'ai conseillé, j'ai ma propre approche pour écrire du code.
Mahdi Al Aradi
5
Votre commentaire sur le fait de ne pas compter sur le code pré-build dans .Net n'a pas de sens, si vous ne devriez pas vous fier au code pré-build, vous ne devriez pas utiliser la char.IsNumber()méthode car c'est du code pré-construit?
Draken
4
Ce code est un excellent exemple de la raison pour laquelle le réinventer vous-même est une si mauvaise idée - il ne fait pas vraiment ce que vous vouliez faire! (La chaîne "@ 1a" retournera true incorrectement, la chaîne "a" retournera false)
Flexo