Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1018 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Regular expression

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PERL] Regular expression

n°547199
burgergold
5$? va chez l'diable!
Posté le 22-10-2003 à 15:00:08  profilanswer
 

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
mood
Publicité
Posté le 22-10-2003 à 15:00:08  profilanswer
 

n°547609
burgergold
5$? va chez l'diable!
Posté le 22-10-2003 à 18:31:26  profilanswer
 

up

n°547615
Mara's dad
Yes I can !
Posté le 22-10-2003 à 18:44:36  profilanswer
 

/^(([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é.
n°547642
burgergold
5$? va chez l'diable!
Posté le 22-10-2003 à 19:01:27  profilanswer
 

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
n°547705
Mara's dad
Yes I can !
Posté le 22-10-2003 à 20:28:35  profilanswer
 

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é.
n°547858
pospos
Posté le 22-10-2003 à 23:18:50  profilanswer
 

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
n°547981
burgergold
5$? va chez l'diable!
Posté le 23-10-2003 à 00:31:02  profilanswer
 

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
n°548066
arghbis
salops de dauphins
Posté le 23-10-2003 à 09:24:04  profilanswer
 

sans compter que pour la maintenance du code, plusieures petites regexp, c quand même mieux q'un gros truc infame!

n°548077
Mara's dad
Yes I can !
Posté le 23-10-2003 à 09:49:13  profilanswer
 

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é.
n°548228
pospos
Posté le 23-10-2003 à 11:58:40  profilanswer
 

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!
 

mood
Publicité
Posté le 23-10-2003 à 11:58:40  profilanswer
 

n°548238
Mara's dad
Yes I can !
Posté le 23-10-2003 à 12:04:38  profilanswer
 

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é.
n°548301
arghbis
salops de dauphins
Posté le 23-10-2003 à 13:10:09  profilanswer
 

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
n°548306
Mara's dad
Yes I can !
Posté le 23-10-2003 à 13:16:22  profilanswer
 

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é.
n°548309
arghbis
salops de dauphins
Posté le 23-10-2003 à 13:19:06  profilanswer
 

question à la con : ton pseud, c en rapport avec "la quête de l'oiseau du temps"?
 
ps : désolé pour le HS

n°548337
Mara's dad
Yes I can !
Posté le 23-10-2003 à 13:44:42  profilanswer
 

Mon pseudo


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
n°548527
burgergold
5$? va chez l'diable!
Posté le 23-10-2003 à 15:43:51  profilanswer
 

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)

n°548539
Mara's dad
Yes I can !
Posté le 23-10-2003 à 15:55:33  profilanswer
 

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é.
n°548589
Mara's dad
Yes I can !
Posté le 23-10-2003 à 16:24:04  profilanswer
 

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é.
n°549684
burgergold
5$? va chez l'diable!
Posté le 24-10-2003 à 14:43:54  profilanswer
 

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

n°549687
arghbis
salops de dauphins
Posté le 24-10-2003 à 14:45:32  profilanswer
 

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

n°549695
burgergold
5$? va chez l'diable!
Posté le 24-10-2003 à 14:54:00  profilanswer
 

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

n°549699
arghbis
salops de dauphins
Posté le 24-10-2003 à 14:58:42  profilanswer
 

ben non, là tu vérifie qu'il commence et termine par un chiffre
 
if ($password =~ /^[^\d]+/ and /[^\d]+$/)

n°549766
burgergold
5$? va chez l'diable!
Posté le 24-10-2003 à 15:37:06  profilanswer
 

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

n°549767
burgergold
5$? va chez l'diable!
Posté le 24-10-2003 à 15:38:16  profilanswer
 

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

n°549768
burgergold
5$? va chez l'diable!
Posté le 24-10-2003 à 15:39:40  profilanswer
 

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

n°549804
arghbis
salops de dauphins
Posté le 24-10-2003 à 16:12:15  profilanswer
 

avais pas fait gaffe au and (qui bien sûr ne marche pas)
 
fait un !~ pour les 2 conséctifs, pas un =~

n°550009
pospos
Posté le 24-10-2003 à 19:37:55  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Regular expression

 

Sujets relatifs
IDE ou editeur special PERL[PERL LDAP] Ajout d'un user dans un group
[LDAP] Création d'usager Java ou Perl?[Perl] Problème avec GTChat
[perl] sbrk échoue, problème de consommation mémoire excessiveaide perl/Tk explication sur le placement SVP.
installer perl en module...[Perl] substitutions, expressions régulières et dictionnaire ...
expression mathématique ---> expression informatique[Perl] use strict !!!
Plus de sujets relatifs à : [PERL] Regular expression


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR