[Ex] Générer une regexp pour un intervalle d'adresses IP
Posté : jeu. 31 mars 2011 11:19
Bonjour !
Qui n'a jamais utilisé d'expressions régulières pour vérifier la bonne cohérence d'une chaine de caractères?
C'est super pratique de voir que si une adresse ip ne respecte pas le format "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", ça ne sera pas une vraie ip (4 paquets de 3 chiffres maximum séparés par des "."), mais ce modèle de regexp ne suffit pas.
On peut toujours affiner la chaine en disant que l'adresse IP doit respecter le format "^(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$", on restreint donc les paquets de chiffres à 255 maximum, c'est beaucoup mieux.
Mais comment vérifier qu'une adresse IP fait partie du bon réseau "aaa.bbb.ccc.ddd/xx" ? générer la regexp qui vérifiera ça est plutôt compliqué...
Je vous propose donc un script dont le but est de créer cette regexp, qui permettra de vérifier qu'une adresse IP matche bien le réseau voulu.
Exemple 1 :
- J'ai un réseau en 192.168.194.0/24, les adresses sont donc du type 192.168.194.XXX
=> Regexp obtenue : "^192\.168\.194\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$"
Exemple 2 :
- J'ai un réseau en 192.168.194.0/22 (équivalent à 192.168.192.0/22), les adresses sont donc du type 192.168.{192,193,194,195}.XXX
=> Regexp obtenue : "^192\.168\.19[2-5]\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$"
Exemple 3 :
- J'ai un réseau en 192.168.128.0/18, les adresses sont donc du type 192.168.{128-191}.XXX
=> Regexp obtenue : "^192\.168\.(12[8-9]|1[3-8][0-9]|19[0-1])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$"
Je vous fournis donc le script suivant à titre d'exemple, il peut très certainement être amélioré, mais il fonctionne plutôt bien. A bientôt!
Qui n'a jamais utilisé d'expressions régulières pour vérifier la bonne cohérence d'une chaine de caractères?
C'est super pratique de voir que si une adresse ip ne respecte pas le format "^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$", ça ne sera pas une vraie ip (4 paquets de 3 chiffres maximum séparés par des "."), mais ce modèle de regexp ne suffit pas.
On peut toujours affiner la chaine en disant que l'adresse IP doit respecter le format "^(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$", on restreint donc les paquets de chiffres à 255 maximum, c'est beaucoup mieux.
Mais comment vérifier qu'une adresse IP fait partie du bon réseau "aaa.bbb.ccc.ddd/xx" ? générer la regexp qui vérifiera ça est plutôt compliqué...
Je vous propose donc un script dont le but est de créer cette regexp, qui permettra de vérifier qu'une adresse IP matche bien le réseau voulu.
Exemple 1 :
- J'ai un réseau en 192.168.194.0/24, les adresses sont donc du type 192.168.194.XXX
=> Regexp obtenue : "^192\.168\.194\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$"
Exemple 2 :
- J'ai un réseau en 192.168.194.0/22 (équivalent à 192.168.192.0/22), les adresses sont donc du type 192.168.{192,193,194,195}.XXX
=> Regexp obtenue : "^192\.168\.19[2-5]\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$"
Exemple 3 :
- J'ai un réseau en 192.168.128.0/18, les adresses sont donc du type 192.168.{128-191}.XXX
=> Regexp obtenue : "^192\.168\.(12[8-9]|1[3-8][0-9]|19[0-1])\.(1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])$"
Je vous fournis donc le script suivant à titre d'exemple, il peut très certainement être amélioré, mais il fonctionne plutôt bien. A bientôt!
... ACCEPTED !