web-dev-qa-db-fra.com

Comment valider une chaîne pour n'autoriser que des caractères alphanumériques?

Comment valider une chaîne en utilisant des expressions régulières pour n'autoriser que des caractères alphanumériques?

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

106
mrblah

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)) {
  ...
}
166
cletus

Dans .NET 4.0, vous pouvez utiliser LINQ:

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

yourText.All s'arrêtera et retournera false la première fois char.IsLetterOrDigit rapports false puisque le contrat de All ne peut être rempli.

Remarque! cette réponse ne vérifie pas strictement les caractères alphanumériques (qui sont typiquement A à Z, a à z et 0 à 9). Cette réponse permet aux caractères locaux comme åäö.

Mise à jour 2018-01-29

La syntaxe ci-dessus ne fonctionne que lorsque vous utilisez une seule méthode ayant 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)))
{
}
190
jgauffin

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)));
}
34
JP Alioto

Bien que je pense que la solution basée sur les expressions rationnelles soit probablement la solution que je choisirais, je serais tenté de résumer cela 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 demander à la signature de la méthode d’exiger un AlphaNumericString et de savoir que si vous en obtenez une, elle est valide (à l’exception de la valeur null). Si quelqu'un tente de passer une chaîne non validée, une erreur de compilation sera générée.

Vous pouvez obtenir plus sophistiqué et implémenter tous les opérateurs d'égalité, ou un transtypage explicite en AlphaNumericString à partir de la chaîne plain ol ', si vous y tenez.

17
kyoryu

Je devais vérifier pour A-Z, a-z, 0-9; sans regex (même si le PO demande une regex).

En mélangeant diverses réponses et commentaires ici, et une discussion de https://stackoverflow.com/a/9975693/29206 , cela teste la lettre ou le chiffre, en évitant les lettres de langage et les nombres tels que fraction personnages.

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}
8
goodeye

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 à l'aide de .NET 4.0 et LINQ:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}
3
Thabiso Mofokeng

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

Utilisation ^[a-zA-Z0-9]+$ pour interdire le soulignement.

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

3
Peter Boughton