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
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
Par contre, même si c’est puissant, ça ne me semble pas trop fait pour
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.
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]
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.