Il doit correspondre à tous les exemples suivants.Expression régulière pour vérifier max 2 chiffres, max de 4 alphabets dans une chaîne alphanumérique de longueur 6?
aBCd22
a2b2CD
22aBcD
Il doit correspondre à tous les exemples suivants.Expression régulière pour vérifier max 2 chiffres, max de 4 alphabets dans une chaîne alphanumérique de longueur 6?
aBCd22
a2b2CD
22aBcD
Une version compacte, en utilisant le test avant positif opérateur :
^(?=(.*[0-9]){2})(?=(.*[A-Za-z]){4})[A-Za-z0-9]{6}$
Explication:
(?=(.*[0-9]){2}) # asserts that you have 2 digits
(?=(.*[A-Za-z]){4}) # asserts that you have 4 characters
[A-Za-z0-9]{6} # does the actual matching of exactly 6 alphanumeric characters
Un cas de test simple, en Python:
import re
rex = re.compile('(?=(.*[0-9]){2})(?=(.*[A-Za-z]){4})[A-Za-z0-9]{6}')
tests = ['aBCd22', 'a2b2CD', '22aBcD', 'asd2as', '', '201ABC', 'abcA213']
for test in tests:
print "'%s' %s" %
(test, "matched" if rex.match(test) != None else "didn't match")
Sortie:
'aBCd22' matched
'a2b2CD' matched
'22aBcD' matched
'asdas' didn't match
'' didn't match
'201ABC' didn't match
'abcA213' didn't match
Propre, simple et efficace. –
En fait, cela vérifie seulement qu'il y a au moins * deux chiffres et au moins * quatre lettres. Cela fonctionne malgré tout, parce que vous ne pouvez pas avoir plus de 2 chiffres + 4 lettres et arriver à exactement six caractères, mais en ce qui concerne les explications ... :) – hobbs
un fragment regex de travail pour valider exactement les chiffres «x» et Les lettres 'y' seraient comme:'/^ (? = ([^ 0-9] * [0-9]) {x} $) (? = ([^ A-Za-z] * [A-Za -z]) {y} $)/'mais si vous me demandez l'idée est trop intelligente. Si vous devez * le faire pour travailler avec un outil qui n'accepte qu'une regex pour la validation, d'accord. Mais si vous n'avez pas besoin de le faire, dites plutôt ce que vous voulez dire. :) – hobbs
Je ne sais pas si vous pouvez le faire avec une seule expression régulière, mais vous pouvez certainement le faire avec deux. Cela dit, il semble un peu excessif d'utiliser regex pour cette tâche.
En Perl, je le ferais:
m/\d.*\d/ # match exactly 2 numeric characters
&&
m/(?:[[:alpha:]].*){4}/ # match exactly 4 alpha characters
Très intelligent. Vous pourriez aussi avoir besoin de vérifier la longueur? –
Votre idée m'a donné l'inspiration pour ma propre réponse. Merci. =] – strager
Vos matchs ne sont pas ancrés, donc encore une fois, ils vérifient que * au moins * deux chiffres et quatre alphas existent quelque part dans la chaîne. – hobbs
Je ne pense pas regex est la voie à suivre ici.
Bien sûr, vous pouvez créer une alternance de tous les ordres possibles de chiffres et de lettres, mais vous aurez besoin de 6 * 5 = 30 d'entre eux.
Je ne connais aucun moyen de faire le comptage que vous voulez avec regex.
Vous pourriez avoir une regex pour vérifier que vous avez 6 caractères alphanumériques, puis effectuez le comptage manuellement.
Peut-être que cela?
(?=[a-z]*\d?[a-z]*\d?)
(?![a-z]*\d[a-z]*\d[a-z]*\d)
(?=\d*[a-z]?\d*[a-z]?\d*[a-z]?\d*[a-z]?)
(?!\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z])
[\da-z]{2,6}
Il fonctionne en vous assurant que la sélection a zéro, un ou deux chiffres (premier test avant), mais n'a pas plus de deux (deuxième préanalyse). De même, il vérifie de zéro à quatre lettres (troisième lookahead) mais pas plus de quatre (quatrième lookahead). La cinquième ligne correspond à un à six caractères.
Si vous voulez faire correspondre uniquement des mots, placez-les dans \b
.
EDIT: Vous avez maintenant ajouté une condition pour que la longueur de la correspondance soit de six caractères. Seule une légère modification est nécessaire:
(?=[a-z]*\d[a-z]*\d)
(?![a-z]*\d[a-z]*\d[a-z]*\d)
(?=\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z])
(?!\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z]\d*[a-z])
[\da-z]{6}
bien, il devrait correspondre à ces exemples aBCd22 a2b2CD 22aBcD abcd22 – kurozakura
@kurozakura: Selon ce site, le mien faire: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression- tester.ashx – strager
Merci :) – kurozakura
Cette expression régulière devrait le faire:
^(?=[a-zA-Z]*\d[a-zA-Z]*\d[a-zA-Z]*$)(?=\d*[a-zA-Z]\d*[a-zA-Z]\d*[a-zA-Z]\d*[a-zA-Z]\d*$).*
Ou plus compact:
^(?=[a-zA-Z]*(?:\d[a-zA-Z]*){2}$)(?=\d*(?:[a-zA-Z]\d*){4}$).*
Heh, ça ressemble beaucoup au mien. =] – strager
^((?<digit>\d)|(?<alpha>[a-zA-Z])){6}
(?<-alpha>){4}(?(alpha)(?!))
(?<-digit>){2}(?(digit)(?!))$
Cela correspond 6 caractères avec exactement 2 chiffres et 4 des lettres. Il le fait en saisissant tout ce qu'il peut ensuite compter les résultats en les sortant de la pile du compteur. Vérifiez le lien this pour plus de détails.
est le « maximum de » redondant? Devrait-il être exactement 2 chiffres, et exactement 4 lettres? –
bien pas plus 2 chiffres et pas plus de 4 alphabets – kurozakura
Donc quelque chose comme "a2" ou "" correspondrait? – strager