[PERL] Regular expression

Regular expression [PERL] - Perl - Programmation

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
Reply

Marsh Posté le 22-10-2003 à 15:00:08   

Reply

Marsh Posté le 22-10-2003 à 18:31:26    

up

Reply

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.


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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"


Message édité par burgergold le 22-10-2003 à 19:01:37
Reply

Marsh Posté le 22-10-2003 à 20:28:35    

J'avais pas vu au moins 1 chiffre !
 
C'est pas dur à corriger :D
 
/^(([a-z]{1})(?!\2))+[0-9]{1}(([a-z]{1})(?!\4))+$/
 
/^(([a-z]{1})(?!\2))+[0-9]+(([a-z]{1})(?!\4))+$/


Message édité par Mara's dad le 22-10-2003 à 20:29:22

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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 :
  1. if (password_valide($pasword)) {
  2.    ...
  3. }
  4. sub password_valide {
  5.   local $_ = shift;
  6.   # 16 caractère max, 6 min
  7.   return 0 unless /^.{6,16}$/;
  8.   # débute et termine par une lettre
  9.   return 0 unless /^\w/ and /\w$/;
  10.  
  11.   # contient au moins 1 chiffre
  12.   return 0 unless /\d/;
  13.   # pas plus de 2 caractères identique l'un a la suite de l'autre
  14.   return 0 if /(.)\1\1/;
  15.   # ok!
  16.   return 1;
  17. }


 
si tu veux un truc plus compacte (et rapide) mais toujours lisible tu peux faire ca:
 

Code :
  1. sub password_valide {
  2.   local $_ = shift;
  3.   /^.{6,16}$/ and /^\w/ and /\w$/ and /\d/ and !/(.)\1\1/;
  4. }


 
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.


Message édité par pospos le 22-10-2003 à 23:19:52
Reply

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


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

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!

Reply

Marsh Posté le 23-10-2003 à 09:49:13    

Truc infame toi-même :o
 
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 :kaola:
Et je veux bien croire qu'un grosse regexp soit plus gourmande en CPU, mais de la à parcourrir la chaîne à tester 4 fois...


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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!
 

Reply

Marsh Posté le 23-10-2003 à 11:58:40   

Reply

Marsh Posté le 23-10-2003 à 12:04:38    

Merci, elle m'en a fait baver :D
 
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 :D
 


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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  :sarcastic:
 
--edit--
 
j'ai oublié de préciser que bien sûr je documente toutes mes regexp et tout mon code  [:fuel]  
 
 [:pioupiou]


Message édité par arghbis le 23-10-2003 à 13:11:08
Reply

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 :D


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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

Reply

Marsh Posté le 23-10-2003 à 13:44:42    

Mon pseudo


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-10-2003 à 15:43:51    

mara's dad: jai choisis ta regexp :D
 
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 :D
 
et en meme temps, que signifie cette partie à la fin du regexp?
(?!\4)

Reply

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 !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 23-10-2003 à 16:24:04    

Bon, le plus simple est quand même de le faire en 2 fois :D
 

/^.{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 :D. 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 :sweat:  
 
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à :D
 
 


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

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 :
  1. if ($password !~ /^[a-zA-Z_]/ or /[a-zA-Z_]$/) {
  2.  $error_msg = "Le mot de passe doit débuter et terminer par un caractère non numérique";
  3.  return 1;
  4. }


 
popos avait écrit ca
 
 # débute et termine par une lettre  
 return 0 unless /^\w/ and /\w$/;  
 
mais \w comprends les numériques...
 

Reply

Marsh Posté le 24-10-2003 à 14:45:32    

ben à la place de \w tu mets [^\d] (tout sauf un chiffre)

Reply

Marsh Posté le 24-10-2003 à 14:54:00    

mon if devient quoi alors? jveux pas d'unless
 
if ($password =~ /^\d/ and /\d$/)
 
???

Reply

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]+$/)

Reply

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

Reply

Marsh Posté le 24-10-2003 à 15:38:16    

if ($password !~ /^[^\d]+/ || $password !~ /[^\d]+$/) {
 
fonctionne ainsi

Reply

Marsh Posté le 24-10-2003 à 15:39:40    

le /(.)\1\1/ pour 2 caractères consécutifs identique ne fonctionne pas non plus :(

Reply

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 =~

Reply

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....)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed