Regular expression [PERL] - Perl - Programmation
Marsh Posté le 22-10-2003 à 18:44:36
/^(([a-z]{1})(?!\2))+[0-9]{1}(([a-z]{1})(?!\4))+$/ |
Penser à doubler les \ s'il faut les échapper.
Marsh Posté le 22-10-2003 à 19:01:27
je viens de tester et ca ne semble pas marcher mais tu m'as p-e lancer sur une bonne piste tout de meme
if ($password !~ /^(([a-z]{1})(?!\2))+[0-9]{1}(([a-z]{1})(?!\4))+$/) {
ca l'aurait du marcher avec "test16er"
Marsh Posté le 22-10-2003 à 20:28:35
J'avais pas vu au moins 1 chiffre !
C'est pas dur à corriger
/^(([a-z]{1})(?!\2))+[0-9]{1}(([a-z]{1})(?!\4))+$/
/^(([a-z]{1})(?!\2))+[0-9]+(([a-z]{1})(?!\4))+$/
Marsh Posté le 22-10-2003 à 23:18:50
le plus simple dans ce genre de cas c'est de faire plusieurs regexps
c'est moins fun (ca c'est clair!), mais plus facile et moins succeptible d'etre buggé, et en plus si les regles changes c'est plus facile à modifier
dans ton cas ca donnerais
Code :
|
si tu veux un truc plus compacte (et rapide) mais toujours lisible tu peux faire ca:
Code :
|
contrairement à ce que l'on croit une grosse rexep n'est pas toujours plus rapide qu'une suite de petites regexp avec des condition (surtout si il ya des choses genre ?! dans ta regexp
de plus dans le truc conditionnelle les regexps de droite ne sont examinées que si celles de gauches etaient valides, donc par exemple la derniere regexp (!/(.)\1\1) qui est celle qui demandera le plus de CPU (à cause de la capture) ne sera executée que si toutes les autres sont ok.
Marsh Posté le 23-10-2003 à 00:31:02
c'est noté, je verrai demain voir si ca fonctionne, ensuite je déciderait laquelle que je choisis
merci à vous 2
Marsh Posté le 23-10-2003 à 09:24:04
sans compter que pour la maintenance du code, plusieures petites regexp, c quand même mieux q'un gros truc infame!
Marsh Posté le 23-10-2003 à 09:49:13
Truc infame toi-même
Elle est chouette ma regexp !
J'ai appris plein de trucs en essayant de la faire.
C'est sûr que c'est pas très lisible, celà dit dans le genre imbitable, les expression régulières se posent là. Donc soit on les utilise, soit on fait autrement
Et je veux bien croire qu'un grosse regexp soit plus gourmande en CPU, mais de la à parcourrir la chaîne à tester 4 fois...
Marsh Posté le 23-10-2003 à 11:58:40
en fait tu la parcours 5 fois au max, mais de toutes facon c'est extremement rapide dans les deux cas et à priori c'est pas un truc critique
Mais elle est jolie ta regexp!
Marsh Posté le 23-10-2003 à 12:04:38
Merci, elle m'en a fait baver
Sinon, les perfs, c'est sûr que c'est pas un problème. Une vérification de password peut se permettre de prendre quelques milisecondes
Marsh Posté le 23-10-2003 à 13:10:09
j'ai pas dit qu'elle était pas belle ta regexp, c'est d'ailleurs un de mes sports favoris (faire des regexp ;-) ), mais bon, pour ceux qui passent derrière, c'est moins facile. sauf si tu la documente bien, évidemment, ce que tout le monde fais bien sûr
--edit--
j'ai oublié de préciser que bien sûr je documente toutes mes regexp et tout mon code
Marsh Posté le 23-10-2003 à 13:16:22
Ben, moi aussi je documente, mais là, j'attendais qu'il pose des questions avant de me lancer dans un décorticage en règle
Marsh Posté le 23-10-2003 à 13:19:06
question à la con : ton pseud, c en rapport avec "la quête de l'oiseau du temps"?
ps : désolé pour le HS
Marsh Posté le 23-10-2003 à 13:44:42
ReplyMarsh Posté le 23-10-2003 à 15:43:51
mara's dad: jai choisis ta regexp
sinon je viens de tester avec plus de 16 caractères et ca passe (ce qui ne devrait pas)
si jamais tu peux m'aider
et en meme temps, que signifie cette partie à la fin du regexp?
(?!\4)
Marsh Posté le 23-10-2003 à 15:55:33
Arf, c'est vrai, j'ai pas du tout testé la longueur !
Je regade, mais je sens que çà va pas simplifier le bouzin !
Marsh Posté le 23-10-2003 à 16:24:04
Bon, le plus simple est quand même de le faire en 2 fois
/^.{6,16}$/ and /^(([a-z]{1})(?!\2))+[0-9]+(([a-z]{1})(?!\4))+$/ |
Explication :
/^(([a-z]{1})(?!\2))+[0-9]+(([a-z]{1})(?!\4))+$/
On a :
(([a-z]{1})(?!\2))+
puis :
[0-9]+
et
(([a-z]{1})(?!\4))+
Bon, pour [0-9]+, c'est clair...
Reste (([a-z]{1})(?!\2))+ et (([a-z]{1})(?!\4))+
([a-z]{1}) Le caractère doit être une lettre en minuscule de 'a' à 'z'. Je le capture avec le (). Grace à {1}, je n'en capture qu'un seul.
(?!\2) ?! indique que le caractère suivant le caractère en cours ne doit pas être \2. \2, c'est une référence à une chaîne capturée. 2 parce-que c'est la deuxème parenthèse. Donc (?!\2) veut simplement dire que le caractère suivant ne doit pas être le même . Le pointeur de caractère n'avance pas dans la chaîne avec cette opération.
Même chose pour (?!\4), sauf qu'on parle de la 4éme paranthèse. Les parenthèse autour de ?!\2 ou ?!\4 ne compte pas
Conclusion, (([a-z]{1})(?!\2))+ signifie, 1 ou plus de lettre de 'a' à 'z', mais pas deux caractères identiques se suivants.
Ensuite test des chiffres, et (([a-z]{1})(?!\4))+ pour de nouveau 1 ou plus de lettre de 'a' à 'z', mais pas deux caractères identiques se suivants.
Voilà
Marsh Posté le 24-10-2003 à 14:43:54
encore moi
finalement pour le user on y va avec plusieurs regex et on spécifit l'erreur
mais j'ai un probleme pour le 1er et le dernier caractères non-numérique
Code :
|
popos avait écrit ca
# débute et termine par une lettre
return 0 unless /^\w/ and /\w$/;
mais \w comprends les numériques...
Marsh Posté le 24-10-2003 à 14:45:32
ben à la place de \w tu mets [^\d] (tout sauf un chiffre)
Marsh Posté le 24-10-2003 à 14:54:00
mon if devient quoi alors? jveux pas d'unless
if ($password =~ /^\d/ and /\d$/)
???
Marsh Posté le 24-10-2003 à 14:58:42
ben non, là tu vérifie qu'il commence et termine par un chiffre
if ($password =~ /^[^\d]+/ and /[^\d]+$/)
Marsh Posté le 24-10-2003 à 15:37:06
fonctionne pas avec le password "1testt"
jai tenté de remplacer =~ par !~ et ca ne fonctionne pas plus
ca se pourrait que le "and" soit pas aimé? perl 5.5.2 en arriere de ca
Marsh Posté le 24-10-2003 à 15:38:16
if ($password !~ /^[^\d]+/ || $password !~ /[^\d]+$/) {
fonctionne ainsi
Marsh Posté le 24-10-2003 à 15:39:40
le /(.)\1\1/ pour 2 caractères consécutifs identique ne fonctionne pas non plus
Marsh Posté le 24-10-2003 à 16:12:15
avais pas fait gaffe au and (qui bien sûr ne marche pas)
fait un !~ pour les 2 conséctifs, pas un =~
Marsh Posté le 24-10-2003 à 19:37:55
burgergold a écrit : le /(.)\1\1/ pour 2 caractères consécutifs identique ne fonctionne pas non plus |
Ben si ca marche: dans ton premier post t'as fait un edit ou t'as dit que tu voulais pas plus de deux caractere consecutifs:
"edit: finalement c'est pas plus de 2 caractères identique l'un a la suite de l'autre"
si t'en veuxc pas plus d'un seul (c'est à dire pas de doublons du tout) ca donne ca:
/(.)\1/
et evidement il faut que cette regexp soif FAUSSE pour que le mot de passe soit valide, donc tu fais !/(.)\1/
sinon pour le \w, désolé je me suis gouré...
mais [^\d] ca te donne les non chiffres mais pas que des caracteres: t'auras des trucs genre ".-+*" etc...
pour les lettre faut faire [a-bA-B]
mais il restera des histoires d'accents (il s'en branlent les anglais....)
Marsh Posté le 22-10-2003 à 15:00:08
Bonjour, je dois monter un regular expression contenant ceci:
16 caractère max, 6 min
débute et termine par une lettre
contient au moins 1 chiffre
ne contient pas plus de 2 caractère identique un à la suite de l'autre (pas de "aaaaaa1a", vous voyez?)
ce qui m'embete surtout, c'est le au moins 1 chiffre et pas plus de 2 caractere identique collé
merci
edit: finalement c'est pas plus de 2 caractères identique l'un a la suite de l'autre
Message édité par burgergold le 22-10-2003 à 15:05:09