2009-08-23 5 views

Répondre

7

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 
+0

Propre, simple et efficace. –

+0

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

+0

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

1

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 
+0

Très intelligent. Vous pourriez aussi avoir besoin de vérifier la longueur? –

+0

Votre idée m'a donné l'inspiration pour ma propre réponse. Merci. =] – strager

+0

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

1

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.

0

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} 
+0

bien, il devrait correspondre à ces exemples aBCd22 a2b2CD 22aBcD abcd22 – kurozakura

+0

@kurozakura: Selon ce site, le mien faire: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression- tester.ashx – strager

+0

Merci :) – kurozakura

0

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}$).* 
+0

Heh, ça ressemble beaucoup au mien. =] – strager

0
^((?<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.

  • (?< -alpha>) {4} signifie 'pop 4 matches de la pile'. Si elle ne peut pas sauter, elle échoue
  • (? (Alpha) (?!)) signifie «s'il y a une correspondance alpha, cherchez (?!), Qui échoue toujours.
  • ^et $ correspondent le début et la fin
Questions connexes