J'ai du mal à écrire une expression régulière qui correspond aux adresses IPv6 valides, y compris celles sous leur forme compressée (avec ::
ou en tête des zéros omis de chaque paire d'octets).
Quelqu'un peut-il suggérer une expression régulière qui répondrait à l'exigence?
J'envisage d'étendre chaque paire d'octets et de faire correspondre le résultat avec une expression régulière plus simple.
regex
networking
ipv6
Lecture seulement
la source
la source
Réponses:
Je n'ai pas pu faire fonctionner la réponse de @Factor Mystic avec les expressions régulières POSIX, alors j'en ai écrit une qui fonctionne avec les expressions régulières POSIX et les expressions régulières PERL.
Il doit correspondre:
Expression régulière IPv6:
Pour faciliter la lecture, voici l'expression régulière ci-dessus divisée aux principaux points OR en lignes séparées:
Pour faciliter la compréhension de ce qui précède, le "pseudo" code suivant reproduit ce qui précède:
J'ai posté un script sur GitHub qui teste l'expression régulière: https://gist.github.com/syzdek/6086792
la source
127.000.000.001
fe80
là où il devrait être quelque chose comme[fF][eE]80
et unffff
qui devrait être quelque chose comme[fF]{4}
Ce qui suit validera les adresses IPv4, IPv6 (complète et compressée) et IPv6v4 (complète et compressée):
la source
Il semble que vous utilisiez peut-être Python. Si tel est le cas, vous pouvez utiliser quelque chose comme ceci:
Je ne pense pas que vous deviez avoir IPv6 compilé dans Python pour obtenir
inet_pton
, qui peut également analyser les adresses IPv4 si vous passez ensocket.AF_INET
premier paramètre. Remarque: cela peut ne pas fonctionner sur les systèmes non Unix.la source
except
clause. Sinon,except
tout attrapera et peut masquer des erreurs sans rapport. Le type ici devrait êtresocket.error
.À partir de « IPv6 regex »:
la source
Je devrais fortement appuyer la réponse de Frank Krueger .
Alors que vous dites que vous avez besoin d'une expression régulière pour correspondre à une adresse IPv6, je suppose que ce dont vous avez vraiment besoin est de pouvoir vérifier si une chaîne donnée est une adresse IPv6 valide. Il y a ici une distinction subtile mais importante.
Il existe plusieurs façons de vérifier si une chaîne donnée est une adresse IPv6 valide et la correspondance d'expressions régulières n'est qu'une solution.
Utilisez une bibliothèque existante si vous le pouvez. La bibliothèque aura moins de bogues et son utilisation entraînera moins de code à maintenir.
L'expression régulière suggérée par Factor Mystic est longue et complexe. Cela fonctionne très probablement, mais vous devriez également réfléchir à la façon dont vous vous débrouilleriez en cas d'échec inattendu. Le point que j'essaie de faire ici est que si vous ne pouvez pas former vous-même une expression régulière requise, vous ne pourrez pas la déboguer facilement.
Si vous n'avez pas de bibliothèque appropriée, il peut être préférable d'écrire votre propre routine de validation IPv6 qui ne dépend pas d'expressions régulières. Si vous l'écrivez, vous le comprenez et si vous le comprenez, vous pouvez ajouter des commentaires pour l'expliquer afin que d'autres puissent également le comprendre et ensuite le maintenir.
Soyez prudent lorsque vous utilisez une expression régulière dont vous ne pouvez pas expliquer la fonctionnalité à quelqu'un d'autre.
la source
return ex1.match(S) && ! ex2.match(S)
).Je ne suis pas un expert Ipv6 mais je pense que vous pouvez obtenir un très bon résultat plus facilement avec celui-ci:
pour répondre "est un ipv6 valide" il me semble ok. Pour le décomposer en parties ... oubliez-le. J'ai omis celui non spécifié (: :) car il est inutile d'avoir une "adresse non spécifiée" dans ma base de données.
le début:
^([0-9A-Fa-f]{0,4}:){2,7}
<- correspond à la partie compressible, nous pouvons traduire cela par: entre 2 et 7 deux points qui peuvent avoir un nombre heaxadécimal entre eux.suivi de:
[0-9A-Fa-f]{1,4}$
<- un nombre hexadécimal (0 en tête omis) OU((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}
<- une adresse Ipv4la source
start() = 0, end() = 3 group(0) = "::1" group(1) = ":" group(2) = "1" group(3) = "null" group(4) = "null" group(5) = "null"
Cela attrape également le bouclage (:: 1) et les adresses ipv6. changé {} en + et mettre: à l'intérieur du premier crochet carré.
testé avec ifconfig -a output http://regexr.com/
L'option o terminal Unix ou Mac OSx renvoie uniquement la sortie correspondante (ipv6) comprenant :: 1
Obtenez toutes les adresses IP (IPv4 OU IPv6) et imprimez la correspondance sur le terme unix OSx
la source
ip a | grep -Po '[\w:]+:+[\w:]+'
Cette expression régulière correspondra aux adresses IPv6 et IPv4 valides conformément à l'implémentation GNU C ++ de regex avec le mode REGULAR EXTENDED utilisé:
la source
Il faut se méfier! En Java, l'utilisation d'InetAddress et des classes associées (Inet4Address, Inet6Address, URL) peut impliquer du trafic réseau! Par exemple, la résolution DNS (URL.equals, InetAddress from string!). Cet appel peut prendre du temps et se bloque!
Pour IPv6, j'ai quelque chose comme ça. Bien sûr, cela ne gère pas les détails très subtils d'IPv6, comme le fait que les indices de zone ne sont autorisés que sur certaines classes d'adresses IPv6. Et cette expression régulière n'est pas écrite pour la capture de groupe, c'est seulement une sorte d'expression régulière "correspond".
S
- Segment IPv6 =[0-9a-f]{1,4}
I
- IPv4 =(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9]{1,2})
Schéma (la première partie correspond aux adresses IPv6 avec le suffixe IPv4, la deuxième partie correspond aux adresses IPv6, le dernier chemin correspond à l'index de la zone):
Et ici, l'expression rationnelle might (insensible à la casse, entoure ce qui a jamais été nécessaire, comme le début / la fin de la ligne, etc.):
la source
L'expression régulière suivante est pour IPv6 uniquement. Le groupe 1 correspond à l'IP.
la source
Une simple expression régulière qui correspondra, mais je ne recommanderais aucune validation de quelque sorte que ce soit:
Notez que cela correspond à la compression n'importe où dans l'adresse, bien que cela ne corresponde pas à l'adresse de bouclage :: 1. Je trouve que c'est un compromis raisonnable afin de garder la regex simple.
J'utilise avec succès cela dans les règles de sélection intelligente iTerm2 pour quad-cliquer sur les adresses IPv6.
la source
A-F
dire nonA-Z
! Notez également que vous excluez la notation quadruple pointée.Si vous utilisez Perl, essayez Net :: IPv6Addr
NetAddr :: IP
Valider :: IP
la source
Dans Scala, utilisez les validateurs Apache Commons bien connus.
http://mvnrepository.com/artifact/commons-validator/commons-validator/1.4.1
Suite aux tests de la méthode
ip(ip: String)
:la source
1200:0000:AB00:1234:0000:2552:7777:1313
est un format valide pour une adresse IPv6, mais ce n'est pas une adresse IPv6 valide comme le renvoie la méthode de test. Je parie qu'il pense que241.54.113.65
c'est une adresse IPv4 valide.En regardant les modèles inclus dans les autres réponses, il existe un certain nombre de bons modèles qui peuvent être améliorés en référençant des groupes et en utilisant des anticipations. Voici un exemple de modèle d'auto-référencement que j'utiliserais en PHP si je devais:
Remarque: PHP a un filtre intégré pour cela, ce qui serait une meilleure solution que ce modèle.
Analyse Regex101
la source
J'ai généré ce qui suit en utilisant python et fonctionne avec le module re. Les affirmations d'anticipation garantissent que le nombre correct de points ou de deux points apparaît dans l'adresse. Il ne prend pas en charge IPv4 en notation IPv6.
la source
Les expressions régulières pour ipv6 peuvent devenir très délicates lorsque vous considérez les adresses avec ipv4 intégré et les adresses compressées, comme vous pouvez le voir à partir de certaines de ces réponses.
La bibliothèque Java IPAddress open source validera toutes les représentations standard d'IPv6 et IPv4 et prend également en charge la longueur du préfixe (et la validation de celle-ci). Avertissement: je suis le chef de projet de cette bibliothèque.
Exemple de code:
la source
En Java, vous pouvez utiliser la classe de bibliothèque
sun.net.util.IPAddressUtil
:la source
Il est difficile de trouver une expression régulière qui fonctionne pour tous les cas IPv6. Ils sont généralement difficiles à maintenir, difficilement lisibles et peuvent entraîner des problèmes de performances. Par conséquent, je souhaite partager une solution alternative que j'ai développée: Expression régulière (RegEx) pour IPv6 séparée de IPv4
Maintenant, vous pouvez demander que "Cette méthode ne trouve qu'IPv6, comment puis-je trouver IPv6 dans un texte ou un fichier?" Voici également des méthodes pour ce problème.
Remarque : Si vous ne souhaitez pas utiliser la classe IPAddress dans .NET, vous pouvez également la remplacer par ma méthode . Il couvre également l'IPv4 mappé et les cas spéciaux, tandis que IPAddress ne couvre pas.
la source
InetAddressUtils
a tous les modèles définis. J'ai fini par utiliser leur modèle directement, et je le colle ici pour référence:la source
Vous utilisez Ruby? Essaye ça:
la source
En fonction de vos besoins, une approximation comme:
peut suffire (comme avec un simple grepping de fichier journal, par exemple).
la source
Pour les utilisateurs de PHP 5.2+, cela
filter_var
fonctionne très bien.Je sais que cela ne répond pas à la question originale (en particulier une solution regex), mais je publie ceci dans l'espoir que cela puisse aider quelqu'un d'autre à l'avenir.
la source
Cela fonctionnera pour IPv4 et IPv6:
la source
::
. eg2404:6800::4003:c02::8a
Voici ce que j'ai trouvé, en utilisant un peu d'anticipation et des groupes nommés. Il s'agit bien sûr d'IPv6, mais cela ne devrait pas interférer avec des modèles supplémentaires si vous souhaitez ajouter IPv4:
la source
Vous pouvez utiliser les outils shell ipextract que j'ai créés à cet effet. Ils sont basés sur regexp et grep.
Usage:
la source
Correspondant simplement à ceux locaux d'une origine avec des crochets inclus. Je sais que ce n'est pas aussi complet, mais en javascript, les autres avaient du mal à retracer les problèmes principalement de ne pas fonctionner, donc cela semble me donner ce dont j'avais besoin pour le moment. des majuscules supplémentaires AF ne sont pas nécessaires non plus.
La version de Jinnko est simplifiée et meilleure je vois.
la source
Comme indiqué ci-dessus, une autre façon d'obtenir une représentation textuelle IPv6 validant l' analyseur est d'utiliser la programmation. En voici un qui est entièrement conforme aux RFC-4291 et RFC-5952. J'ai écrit ce code en ANSI C (fonctionne avec GCC, passé des tests sur Linux - fonctionne avec clang, passé des tests sur FreeBSD). Ainsi, il ne repose que sur la bibliothèque standard ANSI C, donc il peut être compilé partout (je l'ai utilisé pour l'analyse IPv6 à l'intérieur d'un module de noyau avec FreeBSD).
la source
Essayez ce petit one-liner. Il doit uniquement correspondre aux adresses IPv6 non compressées / compressées valides (pas d'hybrides IPv4)
la source
Le regex permet l'utilisation de zéros non significatifs dans les parties IPv4.
Certaines distributions Unix et Mac convertissent ces segments en octals.
Je suggère d'utiliser
25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d
comme segment IPv4.la source
Si vous ne voulez que des IP-s normaux (pas de barres obliques), ici:
Je l'utilise pour mon surligneur de syntaxe dans l'application de l'éditeur de fichiers hôtes. Fonctionne comme un charme.
la source