Expression régulière - Chaine contenant 4 lettres et 4 chiffres

:hello:

Je cherche à valider une chaine contenant 4 lettres et 4 chiffres, dans n’importe quel ordre, à l’aide d’une expression régulière. Par exemple : “abcd1234”, “1234abcd”, “1ab234cd” sont correctes, mais “abcde123” ne l’est pas.

J’ai bien un masque du genre “[a-zA-Z]{4}[0-9]{4}” mais ça prend forcément dans l’ordre : 4 lettres suivies de 4 chiffres. Comment faire pour qu’on ne prenne que l’existence de 4 lettres et 4 chiffres sans se soucier de l’ordre ? :riva:

:hello:
Pas sûr qu’on puisse, ça me semble un poil compliqué, ça sort de l’analyse lexicale, et peut-êre même de l’analyse syntaxique (dans l’optique d’une démarche de compilateur ou interpréteur qu’on sépare en 3 phases: lexicales, syntaxique, sémantique)

A une position donnée, le caractère possible dépend du contenu du reste, et dépend donc du contexte.
bref, si tu est dans un langage de prog, un bête contrôle caractère par caractère serais beaucoup plus simple :wink:

Sans énumérer je vois pas:

[a-zA-Z]{4}[0-9]{4} | [0-9]{4}[a-zA-Z]{4} | [0-9]{1}[a-zA-Z]{4}[0-9]{3} …

[Edited] :paf:

Ouais mais ça marche pas pour “ab12cd34”. On pourrait extrapoler pour prendre en compte toutes les répartitions lettres/chiffres, mais doit y en avoir C(2,8), enfin le truc en proba avec des Cnp… Ou autre chose, m’en souviens plus :paf: Mais ça fait facile plus d’une 100aine de cas à traiter.

deltree > j’en étais arrivé aussi à la conclusion de tester chaque caractère, y’en a que 8 c’est pas la mort… Mais je pensais que vue la puissance des regexp, on pouvait les utiliser pour ce cas de figure.

Un collègue vient de m’apporter une solution utilisant 3 regexp :
RegExp1 = “[0-9]{1}[^0-9][0-9]{1}[^0-9][0-9]{1}[^0-9][0-9]{1}"
RegExp2 = "[a-zA-Z]{1}[^a-zA-Z]
[a-zA-Z]{1}[^a-zA-Z][a-zA-Z]{1}[^a-zA-Z][a-zA-Z]{1}”
RegExp3 = “^[a-zA-Z0-9]{8}$”

La 1ère matche les chiffres : un chiffre suivi d’un non chiffre, un autre chiffre suivi de… 4 fois.
La 2nde fait la même chose pour les lettres.
La 3ème matche la taille de la chaine.

Y’a ptet moyen de les factoriser non ? Bon déjà on peut utiliser les pattern alpha, alnum…

C’est pas c*n du tout du’tiliser 3 regexp, ça marche son truc :smiley:

Par contre, même si c’est puissant, ça ne me semble pas trop fait pour :confused:

Pour moi, on utilise un regexp pour matcher que l’entrée ne contient bien que des caractères et des chiffres, et éventuellement que ça fait 8 lettres (ton regexp 3) et après on compte le nombre de chiffres par programmation, ce qui doit ête plus rapide qu’un regexp.

En le disant, ça me fait penser que le regexp2 ne sert à rien: si tu a 8 alphanum (regexp3) dont 4 chiffres (regexp1), c’est qu’il ne reste forcément que 4 caractères.
:slight_smile:

Ah ouais tiens ! Par contre j’ai l’impression que le moteur de regexp Javascript ne connait pas les patterns genre “alnum”, “alpha”…

Bon maintenant j’ai la même chose à faire pour un mot de passe. Je vais faire pareil avec 3 ou 4 regexp :smiley:

Je crois que c’est seulement en pay hâche pay, ça… :neutre:

Y a ça aussi qui me gave un peu avec les regexp, déjà ça fait des lignes incompréhensibles et imbittables, longues à écrire et à déchiffrer, mais en plus d’un langage à l’autre, la syntaxe diffère. [:eveden]

Apparemment si, javascript gère les expressions régulières, ça ira bien pour une vérification de complexité de mot de passe :wink:
http://www.javascriptkit.com/javatutors/redev2.shtml

par contre, d’un point de vue fiabilité, il vaut mieux refaire le contrôle côté serveur: un petit malin pourrais refaire une page en local qui soumet le formulaire sans contrôle.

Bien sûr qu’il les gère, mais il y a quelques spécificités de syntaxe qu’il ne connait pas… Pour le contrôle côté serveur, ça devrait être implémenté aussi, mais c’est pas moi qui m’en occupe.

et \d pour les nombres?

\d marche pas non plus.

Mes regexp sont longues, mais elles marchent :smiley:

Les Regexp Perl ne sont pas gérées par JS (POSIX pur).
Ainsi tout les \W \D ou encore * etc. ne marchent pas…