Tu t’es déjà demandé comment vérifier si une adresse IP est valide dans ton code ? Ou peut-être que tu cherches à extraire toutes les adresses IP d’un fichier log ? Les expressions régulières (ou regex) sont là pour te sauver ! Je t’explique comment maîtriser les regex pour les adresses IP en quelques lignes de code seulement. C’est plus simple que tu ne le penses ! 🚀
📋 L’essentiel à retenir
- IPv4 : regex basique ^(\\d{1,3}\\.){3}\\d{1,3}$ pour la validation simple
- Validation complète : utiliser des regex plus élaborées pour vérifier que chaque octet est entre 0 et 255
- IPv6 : format plus complexe avec 8 groupes de 1-4 caractères hexadécimaux séparés par des :
- Performance : préférer les bibliothèques dédiées pour les validations intensives
- Test : toujours vérifier tes regex avec des outils comme Regex101 avant implémentation
🔍 Regex pour IPv4 : capturer les adresses en 4 octets
Tu connais sûrement les adresses IPv4, ces suites de 4 nombres séparés par des points comme 192.168.1.1. Pour les capturer avec une regex, on pourrait commencer par quelque chose de simple :
\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}
Cette expression cherche 4 groupes de 1 à 3 chiffres séparés par des points. Mais attention, cette regex n’est pas parfaite ! Elle accepterait des valeurs comme 999.999.999.999, alors qu’une IPv4 valide ne peut pas dépasser 255 pour chaque octet. 😱
Pour une validation plus stricte, essaie plutôt celle-ci :
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
Je sais, ça fait peur au premier coup d’œil ! Mais décomposons-la :
- Le motif 25[0-5] capture les nombres entre 250 et 255
- 2[0-4][0-9] capture les nombres entre 200 et 249
- [01]?[0-9][0-9]? capture les nombres entre 0 et 199
- Le tout est répété 4 fois avec des points entre chaque groupe
Si tu travailles avec JavaScript, voici comment l’utiliser :
💻 Exemple pratique en JavaScript
Imagine que tu veux vérifier si une chaîne est une adresse IPv4 valide :
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
const isValidIPv4 = ipv4Regex.test(‘192.168.1.1’); // Renvoie true
const isInvalid = ipv4Regex.test(‘256.256.256.256’); // Renvoie false, comme attendu !
Tu peux aussi extraire toutes les adresses IPv4 d’un texte avec une regex légèrement modifiée :
const text = ‘Serveurs en ligne: 192.168.1.1 et 10.0.0.1 sont actifs’;
const allIPs = text.match(/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b/g);
// Résultat: [‘192.168.1.1’, ‘10.0.0.1’]
⚡ Qu’en est-il des adresses IPv6 ?
Les adresses IPv6 sont beaucoup plus complexes : elles sont composées de 8 groupes de 1 à 4 caractères hexadécimaux séparés par des deux-points. Par exemple : 2001:0db8:85a3:0000:0000:8a2e:0370:7334. 🤯
Une regex basique pour IPv6 serait :
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
Mais attention, cette regex ne prend pas en compte les formes abrégées d’IPv6 (avec des :: pour remplacer des groupes de zéros). Pour une validation complète, tu auras besoin d’une regex plus complexe :
^(?:[0-9a-fA-F]{1,4}:){6}(?:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$|^::(?:[0-9a-fA-F]{1,4}:){5}(?:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$|^(?:[0-9a-fA-F]{1,4})?::(?:[0-9a-fA-F]{1,4}:){4}(?:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$|^(?:(?:[0-9a-fA-F]{1,4}:){0,1}[0-9a-fA-F]{1,4})?::(?:[0-9a-fA-F]{1,4}:){3}(?:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$|^(?:(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4})?::(?:[0-9a-fA-F]{1,4}:){2}(?:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$|^(?:(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4})?::[0-9a-fA-F]{1,4}:(?:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$|^(?:(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4})?::(?:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}|(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$|^(?:(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4})?::[0-9a-fA-F]{1,4}$|^(?:(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4})?::$
Wow ! C’est énorme, pas vrai ? 😅 Pour des cas complexes comme celui-ci, je te recommande d’utiliser des bibliothèques dédiées plutôt que d’écrire toi-même ces regex monstrueuses.
🛠 Astuces et bonnes pratiques
- Utilise des outils comme Regex101 pour tester et déboguer tes expressions régulières
- Pour des validations intensives, préfère les bibliothèques spécialisées dans la gestion d’IP
- Considère la performance : les regex très complexes peuvent ralentir ton application
- N’oublie pas de gérer les cas particuliers comme les adresses de loopback (127.0.0.1) ou IPv6 abrégées
Voici une table comparative qui pourrait t’aider à choisir la bonne approche :
| Type de validation | Avantages | Inconvénients |
|---|---|---|
| Regex simple | Facile à implémenter, rapide | Peut valider des IPs techniquement invalides |
| Regex complète | Validation précise | Complexe, difficile à maintenir |
| Bibliothèque dédiée | Fiable, maintenable | Dépendance supplémentaire |
Tu vois, valider des adresses IP avec des regex n’est pas si compliqué quand on comprend la logique ! 🎯 Pour les cas simples, une regex basique fera l’affaire. Et n’hésite pas à utiliser des outils en ligne comme Regex101 pour tester tes expressions. Allez, à toi de jouer maintenant !
