Comment faire correspondre les adresses IPv6 avec une expression rationnelle Perl?

StackOverflow https://stackoverflow.com/questions/1802722

  •  05-07-2019
  •  | 
  •  

Question

Je dois donc faire correspondre une adresse ipv6 qui peut ou non avoir un masque. Malheureusement, je ne peux pas utiliser une bibliothèque pour analyser la chaîne.

Le bit de masque est assez simple, dans ce cas:

(?:\/\d{1,3})?$/

La partie la plus difficile concerne les différents formats d’une adresse ipv6. Il doit correspondre à: boeuf, boeuf ::, boeuf :: boeuf, etc.

Une mise à jour: j'y suis presque.

/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i

Je suis, dans ce cas, limité à l'utilisation de l'expression rationnelle de perl.

Était-ce utile?

La solution

Ce contient un correctif pour Regexp :: Common démonstrating une regex IPv6 complète, précise et testée. C'est une traduction directe de la grammaire IPv6. Regexp :: IPv6 est également exact.

Plus important encore, il contient une suite de tests. L'exécuter avec votre regex montre que vous êtes encore loin. 10 ratés sur 19. 1 sur 12 faux positifs. IPv6 contient de nombreux raccourcis spéciaux, ce qui permet de se tromper légèrement.

Le meilleur endroit pour obtenir des informations sur les adresses IPv6 est la section RFC 3986 . 3.2.2.

Autres conseils

Que voulez-vous dire par vous ne pouvez pas utiliser une bibliothèque? Que diriez-vous d'un module? Regexp :: IPv6 vous donnera ce dont vous avez besoin .

Je ne suis pas un expert en IPv6, mais s'il vous plaît, faites-moi confiance quand je vous dis que faire correspondre (et encore moins, valider) des adresses IPv6 n’est pas facile avec une regex très simple telle que celle que vous suggérez. Il existe de nombreux raccourcis et diverses conventions pour associer l'adresse à un port, pour ne nommer qu'un exemple. Un de ces raccourcis est que vous pouvez écrire 0: 0: 0: 0: 0: 0: 0: 1 comme :: 1, mais il y a plus. Si vous lisez en allemand, je vous conseillerais de consulter les diapositives du le discours de Steffen Ullrich . au onzième atelier allemand Perl.

Vous dites que vous ne pouvez pas utiliser une bibliothèque, mais si vous souhaitez réinventer toute la complexité de la bibliothèque, vous pouvez également l'importer textuellement dans votre projet.

Cela fonctionne principalement ...

^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$

Contre: :: comme les cas non traités correctement

Essayez ceci:

^([0-9a-fA-F]{4}|0)(\:([0-9a-fA-F]{4}|0)){7}$

De la Bibliothèque d'expressions régulières: adresse IPv6

Vous devriez également lire ceci: Expression régulière pour les adresses IPv6

Si vous avez besoin de vérifier en Perl si une chaîne est une adresse IPv6, vous pouvez essayer ceci:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") };

Essayez:

/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/ai

De: http://home.deds.nl/~aeron/regex/

voici celui qui a fonctionné pour tous les exemples d'IPv6 que j'ai réussi à trouver:

/^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/

assurez-vous que c'est la seule ligne avant de l'utiliser. ça a été trouvé ici:

https: //community.helpsyst .com / forums / intermapper / divers-sujets / 5acc4fcf-fa83-e511-80cf-0050568460e4

vérifié sur tous les exemples de la page de question, de la page de communauté et du site wikipedia à partir d'ici:

https://en.wikipedia.org/wiki/IPv6

l'outil de vérification utilisé est celui d'ici:

https://regex101.com/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top