florenth
-
2 août 2007 à 18:57
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
7 août 2007 à 18:09
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
Mes premières impressions: un code 100% fonctionnel qui remplit très bien son rôle tout en restant "simple" et concis.
Du Cari à l'état pur, quoi !
Cette fonction MatchesMask() (sûrement la moins bien documentée de l'aide de Delphi) permet donc bien de faire des prouesses.
A noter quelques détails:
- J'ai eu besoin de désactiver le "range checking" pour pouvoir exécuter ChercherIP() car la ligne "while MatchesMask(S[M]+S[M+1],'[0-9.][0-9.]') and (M<Length(S)) do inc(M);" lit en dehors de la chaîne (pas bien ! ^^). Par ailleurs, j'en profite pour dire que cette directive devrait toujours être active, ça évite bien des dégâts.
- C'est quoi cette ligne "Str(GetTickCount-Deb,S);" ??? On utilise IntToStr() à la place ! Et puis comme ça, tu évites ta variable "S". Enfin, c'est pas le plus important.
- Pour avoir toujours plus de performances, tu peux utiliser un objet TMask (toujours dans Masks.pas) qui te permet d'interpréter la chaîne de masque une seule fois dans toute la fonction. Ainsi, tu vas beaucoup plus vite.
- Pour certains traitements, les expressions régulières restent incontournables, mais ça, tu l'as déjà dit toi même. Par contre, ce ne sont pas "les expressions régulières des autres langages" comme tu le dis car il existe des librairies qui permettent d'utiliser les regex (compatible prce en plus) depuis Delphi.
A+
Flo
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 2 août 2007 à 19:40
Merci pour tes remarques toujours aussi pertinentes, Florent :)
- Tu as raison, ça lit bêtement en-dehors de la chaîne. Le pire c'est que je m'en étais aperçu et que j'avais corrigé. Mais j'ai dû oublier de sauvegarder le changement ( quel con ce Cari! ).
- "Str(GetTickCount-Deb,S);" c'est juste pour éviter d'utilsiser l'unité 'SysUtils'. Ca m'énerve de rajouter une unité rien que pour une fonction ;)
- Je vais étudier TMask. Merci pour ce conseil.
- Je voulais parler des langages comme Perl où les expressions régulières font partie intégrante du langage; c'est plus simple à manipuler. Mais après vérification, tu as raison. Il semble bien que ce soit le seul langage offrant cette facilité.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 5 août 2007 à 22:59
Que de code pour valider une adresse IP !
De plus, si je n'ai pas lu trop vite le code, une adresse telle que 00.00.00.00 serait valide ?
Quant à valider une adresse IP V6, on en est loin.
Non, sérieusement, la fonction MatchesMask bien que très utile, atteint ses limites dans le cas présent.
Autant se tourner vers une bonne bibliothèque pour Delphi telle que Regexp Studio (libre et gratuite, pourquoi s'en priver ? http://www.regexpstudio.com/).
Désolé d'avoir un peu cassé l'ambiance mais il m'a semblé nécessaire de remettre les choses dans leur contexte.
D'un côté on a une chaine à analyser et de l'autre, une expression régulière. Le moteur se charge alors de vérifier que le pattern est applicable à la chaine et d'en extraire une partie ou toutes les parties.
Dans le code de Caribensila, c'est une fonction dédiée à la vérification qui est codée. C'est peut-être plus performant pour cet usage, mais c'est moins souple et moins réutilisable sur le long terme.
D'où l'intérêt d'apprendre les expressions régulières même si ça parait rebutant au premier abord. Quand on les a manipulé un certain nombre de fois et qu'on pratique plusieurs langages, le savoir devient immédiatement réutilisable et ça, ça n'a pas de prix.
Je trouve ta critique envers ce code un peu dure.
Si le but de cette source est de montrer l'utilité de la fonction MatchesMask() et ses domaines d'application, alors ce but est parfaitement rempli, même si les IPs validées ne sont pas toutes justes (c'est juste une question de pertinence).
Cela dit, je suis d'accord avec toi sur l'utilité des expressions régulières et ce n'est pas pour rien que je les utilise couramment.
Excuse aussi mon doigt d'avoir glissé pour écrire le PCRE et mon cerveau pour n'avoir pas détecté la faute.
D'ailleurs, au passage, pour valider une IP avec une regex, il faut avoir le coeur bien accroché, surtout pour relire ... et pour comprendre !
Caribensila
Messages postés2527Date d'inscriptionjeudi 15 janvier 2004StatutMembreDernière intervention16 octobre 201918 6 août 2007 à 15:39
@Delphiprog
Tu casses pas l'ambiance, t'en mets! lol
Et on a l'habitude et surtout le plaisir de se faire appeler 'Arthur' quand notre cher Delphiprog remet les pendules à l'heure car ce n'est jamais inutile.
D'autant que ce sont tes quelques réponses sur le forum au sujet des expressions régulières qui m'ont donné l'envie de les connaître et l'idée de les présenter aux autres débutants comme moi (y'a pas que des surdoués, ici). Mais je ne voulais pas les rebuter avec une bibliothèque dédiée et tout l'investissement en temps que ça demande. MatchesMask, dans sa simplicité était une bonne introduction j'ai pensé (voir l'exemple gerbant de Florenth avec regex).
De plus, comme le souligne Florenth, ce n'est pas un code d'extraction d'IP que j'ai posté. Tout au plus un code d'extraction de 'trucs qui ressemblent à des IP' (Comment savoir si 123.125.365.325 est une IP valide ou un N° de tél de Papouasie?). Ce n'était qu'un prétexte pour illustrer MatchesMask qui est peu connue. Et si on arrive aux limites de cette fonction, ça aura au moins servi à montrer MatchesMask() et ces limites.
Quant à valider une IPv6, j'y suis arrivé très facilement avec quelques changements triviaux dans les masques et la gestion des doubles-points qui se suivent. Et si j'y arrive, c'est que c'est pas difficile. ;)
On est donc d'accord sur l'intérêt d'étudier les expressions régulières. Mais sans effrayer, en douceur. :)))
Ensuite..? Il y a les bonnes pistes que tu as signalées. Merci à toi et à Flo.
2 août 2007 à 18:57
Du Cari à l'état pur, quoi !
Cette fonction MatchesMask() (sûrement la moins bien documentée de l'aide de Delphi) permet donc bien de faire des prouesses.
A noter quelques détails:
- J'ai eu besoin de désactiver le "range checking" pour pouvoir exécuter ChercherIP() car la ligne "while MatchesMask(S[M]+S[M+1],'[0-9.][0-9.]') and (M<Length(S)) do inc(M);" lit en dehors de la chaîne (pas bien ! ^^). Par ailleurs, j'en profite pour dire que cette directive devrait toujours être active, ça évite bien des dégâts.
- C'est quoi cette ligne "Str(GetTickCount-Deb,S);" ??? On utilise IntToStr() à la place ! Et puis comme ça, tu évites ta variable "S". Enfin, c'est pas le plus important.
- Pour avoir toujours plus de performances, tu peux utiliser un objet TMask (toujours dans Masks.pas) qui te permet d'interpréter la chaîne de masque une seule fois dans toute la fonction. Ainsi, tu vas beaucoup plus vite.
- Pour certains traitements, les expressions régulières restent incontournables, mais ça, tu l'as déjà dit toi même. Par contre, ce ne sont pas "les expressions régulières des autres langages" comme tu le dis car il existe des librairies qui permettent d'utiliser les regex (compatible prce en plus) depuis Delphi.
A+
Flo
2 août 2007 à 19:40
- Tu as raison, ça lit bêtement en-dehors de la chaîne. Le pire c'est que je m'en étais aperçu et que j'avais corrigé. Mais j'ai dû oublier de sauvegarder le changement ( quel con ce Cari! ).
- "Str(GetTickCount-Deb,S);" c'est juste pour éviter d'utilsiser l'unité 'SysUtils'. Ca m'énerve de rajouter une unité rien que pour une fonction ;)
- Je vais étudier TMask. Merci pour ce conseil.
- Je voulais parler des langages comme Perl où les expressions régulières font partie intégrante du langage; c'est plus simple à manipuler. Mais après vérification, tu as raison. Il semble bien que ce soit le seul langage offrant cette facilité.
5 août 2007 à 22:59
De plus, si je n'ai pas lu trop vite le code, une adresse telle que 00.00.00.00 serait valide ?
Quant à valider une adresse IP V6, on en est loin.
Non, sérieusement, la fonction MatchesMask bien que très utile, atteint ses limites dans le cas présent.
Autant se tourner vers une bonne bibliothèque pour Delphi telle que Regexp Studio (libre et gratuite, pourquoi s'en priver ? http://www.regexpstudio.com/).
Florenth : c'est PCRE (Perl Compatible Regular Expressions) et non prce (voir http://en.wikipedia.org/wiki/PCRE)
Désolé d'avoir un peu cassé l'ambiance mais il m'a semblé nécessaire de remettre les choses dans leur contexte.
D'un côté on a une chaine à analyser et de l'autre, une expression régulière. Le moteur se charge alors de vérifier que le pattern est applicable à la chaine et d'en extraire une partie ou toutes les parties.
Dans le code de Caribensila, c'est une fonction dédiée à la vérification qui est codée. C'est peut-être plus performant pour cet usage, mais c'est moins souple et moins réutilisable sur le long terme.
D'où l'intérêt d'apprendre les expressions régulières même si ça parait rebutant au premier abord. Quand on les a manipulé un certain nombre de fois et qu'on pratique plusieurs langages, le savoir devient immédiatement réutilisable et ça, ça n'a pas de prix.
Allez, quelques bonnes pistes :
Quick reference : l'essentiel des regexp en une page
http://www.night-ray.com/regex.pdf
Pour le reste : http://tinyurl.com/2jwkgd
Bon, c'est encore les vacances pour certains. Si vous cherchez de la lecture intéressante, y a qu'à demander.
6 août 2007 à 13:22
Si le but de cette source est de montrer l'utilité de la fonction MatchesMask() et ses domaines d'application, alors ce but est parfaitement rempli, même si les IPs validées ne sont pas toutes justes (c'est juste une question de pertinence).
Cela dit, je suis d'accord avec toi sur l'utilité des expressions régulières et ce n'est pas pour rien que je les utilise couramment.
Excuse aussi mon doigt d'avoir glissé pour écrire le PCRE et mon cerveau pour n'avoir pas détecté la faute.
D'ailleurs, au passage, pour valider une IP avec une regex, il faut avoir le coeur bien accroché, surtout pour relire ... et pour comprendre !
CIPRegex = '^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$';
6 août 2007 à 15:39
Tu casses pas l'ambiance, t'en mets! lol
Et on a l'habitude et surtout le plaisir de se faire appeler 'Arthur' quand notre cher Delphiprog remet les pendules à l'heure car ce n'est jamais inutile.
D'autant que ce sont tes quelques réponses sur le forum au sujet des expressions régulières qui m'ont donné l'envie de les connaître et l'idée de les présenter aux autres débutants comme moi (y'a pas que des surdoués, ici). Mais je ne voulais pas les rebuter avec une bibliothèque dédiée et tout l'investissement en temps que ça demande. MatchesMask, dans sa simplicité était une bonne introduction j'ai pensé (voir l'exemple gerbant de Florenth avec regex).
De plus, comme le souligne Florenth, ce n'est pas un code d'extraction d'IP que j'ai posté. Tout au plus un code d'extraction de 'trucs qui ressemblent à des IP' (Comment savoir si 123.125.365.325 est une IP valide ou un N° de tél de Papouasie?). Ce n'était qu'un prétexte pour illustrer MatchesMask qui est peu connue. Et si on arrive aux limites de cette fonction, ça aura au moins servi à montrer MatchesMask() et ces limites.
Quant à valider une IPv6, j'y suis arrivé très facilement avec quelques changements triviaux dans les masques et la gestion des doubles-points qui se suivent. Et si j'y arrive, c'est que c'est pas difficile. ;)
On est donc d'accord sur l'intérêt d'étudier les expressions régulières. Mais sans effrayer, en douceur. :)))
Ensuite..? Il y a les bonnes pistes que tu as signalées. Merci à toi et à Flo.