Expression régulière pour les caractères alphanumériques et les traits de soulignement
585
Je voudrais 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 traits de soulignement.
Il est dommage que les différents moteurs d'expression rationnelle aient des moyens différents pour correspondre aux caractères alphanumériques. Une question comme celle-ci (plutôt vague, sans indication de langue / expression rationnelle indiquée) nécessite une réponse très longue, ou du moins très organisée, qui s'attarde sur chaque saveur.
Wiktor Stribiżew
Réponses:
939
Pour faire correspondre une chaîne qui ne contient que 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 également.
Décomposer:
^: start ofstring[: beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9: any digit
_ : underscore
]:endof character group*: zero or more of the given characters
$ :endofstring
Si vous ne souhaitez pas autoriser les chaînes vides, utilisez + au lieu de *.
Comme d'autres l'ont souligné, 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 l'utiliser \wcomme raccourci (cédant ^\w*$ou ^\w+$). Notez que dans d'autres langues, et par défaut dans .NET, \west un peu plus large, et correspondra également à d'autres sortes de caractères Unicode (merci à Jan de l'avoir signalé). Donc, si vous avez vraiment l'intention de ne faire correspondre que ces caractères, il est probablement préférable d'utiliser la forme explicite (plus longue).
Si jamais vous allez en Allemagne ou si vous voyez à peu près n'importe quel texte allemand, vous verrez ce que je dis.
Programmeur Windows
30
\ w et [A-Za-z0-9_] ne sont pas équivalents dans la plupart des versions regex. \ w comprend des lettres avec des signes diacritiques, des lettres d'autres scripts, etc.
Jan Goyvaerts
4
La question initiale disait "lettres majuscules et minuscules", il semblerait donc que les "lettres" des scripts non latins devraient correspondre.
Trejkaz
3
[\p{upper}\p{lower}\p{gc=Number}_]est tout ce dont vous avez besoin pour faire cela correctement, en supposant qu'il n'y a pas de combinaison de caractères.
tchrist
1
Il semble que preg_match nécessite que votre modèle soit entouré de délimiteurs, qui sont normalement des barres obliques. Vous aurez donc besoin de "/ ^ [a-zA-Z0-9 _] * $ /". Voir cette question pour plus d'informations: stackoverflow.com/questions/6445133/… . Voir aussi cette page: forums.phpfreaks.com/topic/…
Charlie
346
Il y a beaucoup de verbosité ici, et je suis profondément contre, donc, ma réponse concluante serait:
/^\w+$/
\west équivalent à [A-Za-z0-9_], ce qui est à peu près ce que vous voulez. (sauf si nous introduisons unicode dans le mix)
En utilisant le +quantificateur, vous associez un ou plusieurs caractères. Si vous souhaitez également accepter une chaîne vide, utilisez *plutôt.
L'anglais n'est pas la seule langue au monde, donc ce devrait être la réponse acceptée, pas la [a-z]et ses variantes. \wcapturera également les caractères non latins. Comme šēēāouкукареку
Alex
1
Validé en page 318 du O'Reilly "Mastering Regular Expressions"
guidotex
36
Vous souhaitez 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 raccourcie:
\w
Ce qui est équivalent (dans certaines versions regex, assurez-vous donc 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, puis utilisez
$
Pour indiquer que la chaîne doit se terminer par ce caractère. Ensuite, utilisez
\w+or \w*
Pour indiquer "1 ou plus" ou "0 ou plus". Dans l'ensemble, nous avons:
\ w et [A-Za-z0-9_] ne sont pas équivalents dans la plupart des versions regex. \ w comprend des lettres avec des signes diacritiques, des lettres d'autres scripts, etc.
Jan Goyvaerts
32
Um ... question: faut-il avoir au moins un personnage ou pas? 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 soulignement. S'il peut être de longueur nulle, remplacez simplement le + par *
^[A-Za-z0-9_]*$
Éditer:
Si des signes diacritiques doivent être inclus (tels que cedilla - ç), vous devrez utiliser le mot caractère qui fait la même chose que ci-dessus, mais inclut les caractères diacritiques:
Eh bien maintenant que vous le mentionnez, j'ai également raté tout un tas d'autres personnages français ...
BenAlabaster
1
\ w est identique à [\ w] avec moins d'effort de frappe
Jan Goyvaerts
Ouais, vous avez toujours besoin du + ou * et du ^ et $ - \ w vérifie juste qu'il contient des caractères de mot, pas qu'il ne contient que des caractères de mot ...
BenAlabaster
bizarrement, cela permet toujours le signe $.
Induster
@Induster, c'est à cause de ce que BenAlabaster vient de souligner
Sebas
27
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 des liens ci-dessus indique que \w"Correspondra à n'importe quel caractère compris entre 0 - 9, A - Z et a - z (équivalent de POSIX [: alnum:])", je n'ai pas trouvé que c'était vrai . Pas de grep -Ptoute 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 ce qui suit pour 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 régulière peut fonctionner sur des chaînes non ASCII, ce que les expressions régulières basées sur la plage ne feront pas car elles s'appuient sur l'ordre sous-jacent des caractères ASCII qui peut être différent des autres jeux de caractères et exclura donc certains caractères non ASCII (lettres comme œ) que vous voudrez peut-être capturer.
En informatique, une valeur alphanumérique signifie souvent que le premier caractère n'est pas un nombre mais est un alphabet ou un trait de soulignement. Par la suite , le caractère peut être 0-9, A-Z, a-zou underscore ( _).
utilisez des lookaheads pour faire "au moins un" truc. Croyez-moi, c'est beaucoup plus facile.
Voici un exemple qui nécessiterait de 1 à 10 caractères, contenant au moins un chiffre et une lettre:
^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$
REMARQUE: aurait pu utiliser \ w mais des considérations ECMA / Unicode entrent en jeu augmentant la couverture de caractères du \ w "caractère de mot".
Comment ferions-nous si nous voulons ajouter _ et - à la liste?
Rahi
10
Essayez ces extensions multilingues que j'ai faites pour la chaîne.
IsAlphaNumeric - La chaîne doit contenir au moins 1 alpha (lettre dans la plage Unicode, spécifiée dans charSet) et au moins 1 nombre (spécifié dans numSet). De plus, la chaîne ne doit comprendre que des caractères alpha et numériques.
IsAlpha - La chaîne doit contenir au moins 1 alpha (dans le langage charSet spécifié) et ne comprendre que de l'alpha.
IsNumeric - La chaîne doit contenir au moins 1 nombre (dans la langue numSet spécifiée) et comprendre uniquement des nombres.
La plage charSet / numSet pour la langue souhaitée peut être spécifiée. Les gammes Unicode sont disponibles sur le lien ci-dessous:
//Englishstring test ="AASD121asf";//Greek//string test = "Ϡϛβ123";//Bengali//string test = "শর৩৮";//Hindi//string test = @"क़लम३७ख़";bool isAlphaNum = test.IsAlphaNumeric();
@Shah: J'ai ajouté les seuls alphabets (et seulement les chiffres aussi).
Shantanu
8
L'expression rationnelle suivante correspond aux caractères alphanumériques et au trait de soulignement:
^[a-zA-Z0-9_]+$
Par exemple, en Perl:
#!/usr/bin/perl -wmy $arg1 = $ARGV[0];# check that the string contains *only* one or more alphanumeric chars or underscoresif($arg1 !~/^[a-zA-Z0-9_]+$/){print"Failed.\n";}else{print"Success.\n";}
Le modèle dans votre code est correct, mais le modèle ci-dessus ne vérifie qu'une seule instance.
BenAlabaster
C'était intentionnel, l'exemple de code était destiné à clarifier l'utilisation de la vérification d'une chaîne. Aussi pourquoi le code a aussi les marqueurs de début et de fin de ligne qui ne sont pas dans l'exemple regex.
Jay
1
@Windows programmer - en.wikipedia.org/wiki/Alphanumeric - alphabet latin , pas "jeu de caractères latin" qui est ce qui inclut les signes diacritiques, etc. 0-9.
Jay
2
ñ est une lettre de l'alphabet en espagnol, y compris en Amérique latine.
Programmeur Windows
2
"Je voudrais 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 traits de soulignement" ne la limite pas aux lettres latines. «Le regex suivant correspond aux caractères alphanumériques et au soulignement» ne le limite pas aux lettres latines. "^ [a-zA-Z0-9 _] + $" échoue.
La question d'origine n'exigeait pas que la lettre soit présente.
Dmitry Kuzminov
De quelle lettre parles-tu? Mon expression régulière contient celle posée dans la question. Alphabets, chiffres, tiret bas
Chinmaya Pati
l' 1234est le mot de la langue demandée par l' auteur. Votre langue est plus restrictive.
Dmitry Kuzminov
4
Pour moi, il y avait un problème en ce que je voulais faire la distinction entre alpha, numérique et alpha numérique, donc pour m'assurer qu'une chaîne alphanumérique contient au moins un alpha et au moins un numérique, j'ai utilisé:
Si vous voulez juste du latin, faites p {Latin} au lieu de p {L}
Agustin
2
Je crois que vous ne prenez pas de caractères latins et Unicode dans vos matchs. Par exemple, si vous devez utiliser les caractères "ã" ou "ü", l'utilisation de "\ w" ne fonctionnera pas.
Cela fonctionne pour moi, trouvé cela dans le "Mastering Regular Expressions" de O'Reilly:
/^\w+$/
Explication:
^ affirme la position au début de la chaîne
\ w + correspond à n'importe quel caractère de mot (égal à [a-zA-Z0-9_])
Quantificateur "+" - Correspond entre une fois et un nombre illimité, autant de fois que possible, en redonnant selon les besoins (gourmand)
$ affirme la position à la fin de la chaîne
Vérifiez vous-même:
const regex =/^\w+$/;const str =`nut_cracker_12`;let m;if((m = regex.exec(str))!==null){// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex)=>{
console.log(`Found match, group ${groupIndex}: ${match}`);});}
Réponses:
Pour faire correspondre une chaîne qui ne contient que ces caractères (ou une chaîne vide), essayez
Cela fonctionne pour les expressions régulières .NET, et probablement pour beaucoup d'autres langages également.
Décomposer:
Si vous ne souhaitez pas autoriser les chaînes vides, utilisez + au lieu de *.
Comme d'autres l'ont souligné, 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 l'utiliser\w
comme raccourci (cédant^\w*$
ou^\w+$
). Notez que dans d'autres langues, et par défaut dans .NET,\w
est un peu plus large, et correspondra également à d'autres sortes de caractères Unicode (merci à Jan de l'avoir signalé). Donc, si vous avez vraiment l'intention de ne faire correspondre que ces caractères, il est probablement préférable d'utiliser la forme explicite (plus longue).la source
[\p{upper}\p{lower}\p{gc=Number}_]
est tout ce dont vous avez besoin pour faire cela correctement, en supposant qu'il n'y a pas de combinaison de caractères.Il y a beaucoup de verbosité ici, et je suis profondément contre, donc, ma réponse concluante serait:
\w
est équivalent à[A-Za-z0-9_]
, ce qui est à peu près ce que vous voulez. (sauf si nous introduisons unicode dans le mix)En utilisant le
+
quantificateur, vous associez un ou plusieurs caractères. Si vous souhaitez également accepter une chaîne vide, utilisez*
plutôt.la source
\w
n'est généralement pas limité à ASCII seul.[a-z]
et ses variantes.\w
capturera également les caractères non latins. Commešēēā
ouкукареку
Vous souhaitez vérifier que chaque personnage correspond à vos besoins, c'est pourquoi nous utilisons:
Et vous pouvez même utiliser la version raccourcie:
Ce qui est équivalent (dans certaines versions regex, assurez-vous donc 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, puis utilisez
Pour indiquer que la chaîne doit se terminer par ce caractère. Ensuite, utilisez
Pour indiquer "1 ou plus" ou "0 ou plus". Dans l'ensemble, nous avons:
la source
Um ... question: faut-il avoir au moins un personnage ou pas? Peut-il s'agir d'une chaîne vide?
Fera au moins une majuscule ou une minuscule alphanumérique ou un soulignement. S'il peut être de longueur nulle, remplacez simplement le + par *
Éditer:
Si des signes diacritiques doivent être inclus (tels que cedilla - ç), vous devrez utiliser le mot caractère qui fait la même chose que ci-dessus, mais inclut les caractères diacritiques:
Ou
la source
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:Cependant, bien que la documentation des liens ci-dessus indique que
\w
"Correspondra à n'importe quel caractère compris entre 0 - 9, A - Z et a - z (équivalent de POSIX [: alnum:])", je n'ai pas trouvé que c'était vrai . Pas degrep -P
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 ce qui suit pour court et doux:En plus de la lisibilité, l'utilisation des classes de caractères POSIX ( http://www.regular-expressions.info/posixbrackets.html ) signifie que votre expression régulière peut fonctionner sur des chaînes non ASCII, ce que les expressions régulières basées sur la plage ne feront pas car elles s'appuient sur l'ordre sous-jacent des caractères ASCII qui peut être différent des autres jeux de caractères et exclura donc certains caractères non ASCII (lettres comme œ) que vous voudrez peut-être capturer.
la source
En informatique, une valeur alphanumérique signifie souvent que le premier caractère n'est pas un nombre mais est un alphabet ou un trait de soulignement. Par la suite , le caractère peut être
0-9
,A-Z
,a-z
ou underscore (_
).Voici comment procéder:
Testé sous php:
ou prenez ça
et placez-le dans votre langage de développement.
la source
Que diriez-vous:
... si vous voulez être explicite, ou:
... si vous préférez concis (syntaxe Perl).
la source
utilisez des lookaheads pour faire "au moins un" truc. Croyez-moi, c'est beaucoup plus facile.
Voici un exemple qui nécessiterait de 1 à 10 caractères, contenant au moins un chiffre et une lettre:
REMARQUE: aurait pu utiliser \ w mais des considérations ECMA / Unicode entrent en jeu augmentant la couverture de caractères du \ w "caractère de mot".
la source
Essayez ces extensions multilingues que j'ai faites pour la chaîne.
IsAlphaNumeric - La chaîne doit contenir au moins 1 alpha (lettre dans la plage Unicode, spécifiée dans charSet) et au moins 1 nombre (spécifié dans numSet). De plus, la chaîne ne doit comprendre que des caractères alpha et numériques.
IsAlpha - La chaîne doit contenir au moins 1 alpha (dans le langage charSet spécifié) et ne comprendre que de l'alpha.
IsNumeric - La chaîne doit contenir au moins 1 nombre (dans la langue numSet spécifiée) et comprendre uniquement des nombres.
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:
Utilisation:
la source
L'expression rationnelle suivante correspond aux caractères alphanumériques et au trait de soulignement:
Par exemple, en Perl:
la source
Cela devrait fonctionner dans la plupart des cas.
/^[\d]*[a-z_][a-z\d_]*$/gi
Et par la plupart je veux dire,
Explication
^ ... $
- faire correspondre le motif commençant et finissant par[\d]*
- correspondre à zéro ou plusieurs chiffres[a-z_]
- correspondre à un alphabet ou à un trait de soulignement[a-z\d_]*
- correspondre à un alphabet ou un chiffre ou un trait de soulignement/gi
- correspondre globalement à travers la chaîne et insensible à la cassela source
1234
est le mot de la langue demandée par l' auteur. Votre langue est plus restrictive.Pour moi, il y avait un problème en ce que je voulais faire la distinction entre alpha, numérique et alpha numérique, donc pour m'assurer qu'une chaîne alphanumérique contient au moins un alpha et au moins un numérique, j'ai utilisé:
la source
Voici l'expression régulière de ce que vous voulez avec un quantificateur pour spécifier au moins 1 caractère et pas plus de 255 caractères
la source
Pour ceux d'entre vous qui recherchent une correspondance alphanumérique unicode, vous voudrez peut-être faire quelque chose comme:
Lectures complémentaires sur http://unicode.org/reports/tr18/ et sur http://www.regular-expressions.info/unicode.html
la source
Je crois que vous ne prenez pas de caractères latins et Unicode dans vos matchs. Par exemple, si vous devez utiliser les caractères "ã" ou "ü", l'utilisation de "\ w" ne fonctionnera pas.
Vous pouvez également utiliser cette approche:
J'espère que cela aide!
la source
Pour vérifier la chaîne entière et ne pas autoriser les chaînes vides, essayez
la source
^\w*$
fonctionnera pour les combinaisons ci-dessousla source
cela fonctionne pour moi, vous pouvez essayer
la source
Cela fonctionne pour moi, trouvé cela dans le "Mastering Regular Expressions" de O'Reilly:
Explication:
Vérifiez vous-même:
la source