web-dev-qa-db-fra.com

Expression régulière pour les caractères alphanumériques et les traits de soulignement

J'aimerais avoir une expression régulière qui vérifie si une chaîne ne contient que des lettres majuscules et minuscules, des chiffres et des caractères de soulignement.

487
Jim

Pour faire correspondre une chaîne contenant seulement ces caractères (ou une chaîne vide), essayez

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

Cela fonctionne pour les expressions régulières .NET, et probablement pour beaucoup d'autres langages.

Le décomposer:

^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

Si vous ne souhaitez pas autoriser les chaînes vides, utilisez + au lieu de *.

EDIT Comme d'autres l'ont déjà fait remarquer, certaines langues d'expression régulière ont une forme abrégée pour [a-zA-Z0-9_]. Dans le langage regex .NET, vous pouvez activer le comportement ECMAScript et utiliser le raccourci \w (renvoyant ^\w*$ ou ^\w+$). Notez que dans d'autres langues, et par défaut dans .NET, \w est un peu plus large et correspond à d'autres types de caractères unicode (merci à Jan de l'avoir signalé). Donc, si vous avez vraiment l'intention de faire correspondre ces caractères à seulement, il est probablement préférable d'utiliser la forme explicite (la plus longue).

809
Charlie

Il y a beaucoup de verbosité ici, et je suis profondément contre, alors ma réponse décisive serait:

/^\w+$/

\w est équivalent à [A-Za-z0-9_], ce qui correspond à peu près à ce que vous voulez. (sauf si nous introduisons unicode dans le mix)

En utilisant le quantificateur +, vous ferez correspondre un ou plusieurs caractères. Si vous souhaitez également accepter une chaîne vide, utilisez plutôt *.

276
kch

Vous voulez vérifier que chaque personnage correspond à vos besoins, c'est pourquoi nous utilisons:

[A-Za-z0-9_]

Et vous pouvez même utiliser la version abrégée:

\w

Ce qui est équivalent (dans certains goûts regex, assurez-vous de vérifier avant de l'utiliser). Ensuite, pour indiquer que la chaîne entière doit correspondre, vous utilisez:

^

Pour indiquer que la chaîne doit commencer par ce caractère, utilisez ensuite

$

Pour indiquer que la chaîne doit se terminer par ce caractère. Puis utiliser

\w+ or \w*

Pour indiquer "1 ou plus" ou "0 ou plus". En réunissant tout cela, nous avons:

^\w*$
33
Anton

Bien que ce soit plus verbeux que \w, j’apprécie personnellement la lisibilité des noms de classe de caractères POSIX complets ( http://www.zytrax.com/tech/web/regex.htm#special ), alors je dirais : 

^[[:alnum:]_]+$

Cependant, bien que la documentation au niveau des liens ci-dessus indique que \w "correspond à tout caractère compris entre 0 et 9, A - Z et a - z (équivalent de POSIX [: alnum:])", je n’ai pas trouvé ce résultat. vrai. Pas avec grep -P de toute façon. Vous devez inclure explicitement le trait de soulignement si vous utilisez [:alnum:], mais pas si vous utilisez \w. Vous ne pouvez pas battre les points suivants pour un court et doux:

^\w+$

En plus de la lisibilité, l’utilisation des classes de caractères POSIX ( http://www.regular-expressions.info/posixbrackets.html ) signifie que votre expression rationnelle peut fonctionner sur des chaînes non ASCII, que les expressions rationnelles basées sur la plage ne le feront pas car ils reposent sur l'ordre sous-jacent des caractères ASCII qui peuvent être différents des autres jeux de caractères et exclura donc certains caractères non-ASCII (des lettres telles que œ) que vous voudrez peut-être capturer.

24

Euh ... question: Faut-il avoir au moins un caractère ou non? Peut-il s'agir d'une chaîne vide?

^[A-Za-z0-9_]+$

Fera au moins une majuscule ou une minuscule alphanumérique ou un trait de soulignement. Si la longueur est zéro, remplacez simplement le + par *

^[A-Za-z0-9_]*$

Modifier:

Si des signes diacritiques doivent être inclus (tels que cedilla - ç), vous devrez utiliser le caractère Word qui fait la même chose que ce qui précède, mais inclut les caractères diacritiques:

^\w+$

Ou

^\w*$
23
BenAlabaster

En informatique, une valeur alphanumérique signifie souvent que le premier caractère n'est pas un nombre mais un alphabet ou un tiret bas. Ensuite, le caractère peut être 0-9, A-Z, a-z ou un trait de soulignement (_).

Voici comment vous feriez cela:

Testé sous php:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

ou prendre ceci

^[A-Za-z_][A-Za-z\d_]*$

et placez-le dans votre langue de développement.

15
Danuel O'Neal

Que diriez-vous:

^([A-Za-z]|[0-9]|_)+$

... si vous voulez être explicite, ou:

^\w+$

... si vous préférez être concis (syntaxe Perl).

12
Drew Hall

utilisez les mots clés pour faire le "au moins un" truc. Croyez-moi, c'est beaucoup plus facile.

Voici un exemple qui nécessiterait 1 à 10 caractères, contenant au moins un chiffre et une lettre: 

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

NOTE: aurait pu utiliser\w mais les considérations ECMA/Unicode entrent en jeu en augmentant la couverture de caractères du\w "Caractère Word".

11
boooloooo

Essayez ces extensions multilingues que j'ai créées pour string. 

IsAlphaNumeric - La chaîne doit contenir au moins 1 alpha (lettre comprise dans la plage Unicode, spécifiée dans charSet) et au moins 1 chiffre (spécifié dans numSet). En outre, la chaîne ne devrait comporter que des caractères alpha et numériques.

IsAlpha - La chaîne doit contenir au moins 1 alpha (dans la langue spécifiée) et ne comporter que de l'alpha.

IsNumeric - La chaîne doit contenir au moins un nombre (dans la langue spécifiée par numSet) et ne comporter que des chiffres.

La plage charSet/numSet pour la langue souhaitée peut être spécifiée. Les gammes Unicode sont disponibles sur le lien ci-dessous:

http://www.ssec.wisc.edu/~tomw/Java/unicode.html

API:

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

Utilisation:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();
9
Shantanu

La regex suivante correspond aux caractères alphanumériques et au trait de soulignement: 

^[a-zA-Z0-9_]+$

Par exemple, en Perl:

#!/usr/bin/Perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}
8
Jay

Pour moi, il y avait un problème en ce que je voulais faire la distinction entre alpha, numérique et alphanumérique, donc pour m'assurer qu'une chaîne alphanumérique contienne au moins un alpha et un numérique, j'ai utilisé: 

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$
4
mylesmckeown

Pour ceux qui recherchent une correspondance alphanumérique unicode, vous souhaiterez peut-être faire quelque chose comme:

^[\p{L} \p{Nd}_]+$

Autres lectures sur http://unicode.org/reports/tr18/ Et sur http://www.regular-expressions.info/unicode.html

2
Agustin

faire correspondre des signes diacritiques dans une expression rationnelle ouvre toute une boîte de Pandore, surtout si vous prenez Unicode en considération Vous voudrez peut-être en savoir plus sur les paramètres régionaux Posix.

1
Jean-Denis Muys

Voici la regex de ce que vous voulez avec un quantificateur pour spécifier au moins 1 caractère et pas plus de 255 caractères

[^ a-zA-Z0-9 _] {1 ​​255}

1
mson

^\w * $ fonctionnera pour la combinaison ci-dessous 1 123 1av pRo av1

0
Mukund

Pour vérifier la chaîne entière et ne pas autoriser les chaînes vides, essayez

^[A-Za-z0-9_]+$
0
David Norman

Je pense que vous ne prenez pas de caractères latins et Unicode dans vos correspondances ... Par exemple, si vous devez utiliser des caractères "ã" ou "ü", l'utilisation de "\ w" ne fonctionnera pas.

Vous pouvez également utiliser cette approche:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

J'espère que ça aide!

0
Marcio Martins

cela fonctionne pour moi, vous pouvez essayer [\ p {Alnum} _]

0
Saurabh