2013-02-01 3 views
3

J'ai une expression régulière pour les adresses IPv6 comme indiqué ci-dessousexpression régulière pour adresses IPv6

IPV4ADDRESS  [ \t]*(([[:digit:]]{1,3}"."){3}([[:digit:]]{1,3}))[ \t]* 
x4    ([[:xdigit:]]{1,4}) 
xseq    ({x4}(:{x4}){0,7}) 
xpart   ({xseq}|({xseq}::({xseq}?))|::{xseq}) 
IPV6ADDRESS  [ \t]*({xpart}(":"{IPV4ADDRESS})?)[ \t]* 

Il est correctement tous les formats d'adresses IPv6, y compris

1) non-compressed IPv6 addresses 
2) compressed IPv6 addresses 
3) IPv6 addresses in legacy formats.(supporting IPv4) 

exemples idéaux d'adresses IPv6 dans des formats existants Par opposition à 8 groupes dans les adresses IPv6 normales.C'est parce que

2001:1234::3210:5.6.7.8 

    OR 
2001:1234:1234:5432:4578:5678:5.6.7.8 

As you can see above there are 10 groups separated by either `":" or ".".` 

les 4 derniers groupes qui sont séparés par `". " devrait être compressé en 32 bits les moins significatifs des adresses IPv6. D'où nous avons besoin de 10 groupes pour satisfaire 128 bits.

si j'utilise le format d'adresse suivante

2001:1234:4563:3210:5.6.7.8 

Ici, chaque groupe séparés par ":" représente 16-bits.the quatre derniers groupes separted par "" représente 8 bits.Le nombre total de bits est 64 + 32 = 96 bits. 32 bits sont manquants

L'expression régulière l'accepte comme un format d'adresse IPv6 valide.Je n'arrive pas à comprendre comment corriger l'expression régulière jeter ces valeurs.Toute aide est très appréciée.

+1

Pourriez-vous expliquer ce qui ne va pas avec l'exemple négatif fourni? –

+0

il est expliqué ci-dessus l'exemple. Chaque groupe séparé par ":" représente 16 bits. Les quatre derniers groupes séparés par "." représente 8 bits. Le nombre total de bits est 64 + 32 = 96 bits. 32 bits sont manquants. – liv2hak

+1

Eh bien, il accepte aussi des absurdités telles que: 0: 999.999.999.999. – nneonneo

Répondre

5

est ici la grammaire pour les adresses IPv6 comme indiqué dans RFC 3986 et par la suite affirmé dans RFC 5954:

IPv6address =        6(h16 ":") ls32 
       /      "::" 5(h16 ":") ls32 
       /[    h16 ] "::" 4(h16 ":") ls32 
       /[ *1(h16 ":") h16 ] "::" 3(h16 ":") ls32 
       /[ *2(h16 ":") h16 ] "::" 2(h16 ":") ls32 
       /[ *3(h16 ":") h16 ] "::" h16 ":" ls32 
       /[ *4(h16 ":") h16 ] "::"    ls32 
       /[ *5(h16 ":") h16 ] "::"    h16 
       /[ *6(h16 ":") h16 ] "::" 

h16   = 1*4HEXDIG 
ls32   = (h16 ":" h16)/IPv4address 
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet 
dec-octet  = DIGIT     ; 0-9 
       /%x31-39 DIGIT   ; 10-99 
       /"1" 2DIGIT   ; 100-199 
       /"2" %x30-34 DIGIT  ; 200-249 
       /"25" %x30-35   ; 250-255 

Avec cela, nous pouvons construire une expression régulière conforme aux normes pour les adresses IPv6.

dec_octet  ([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]) 
ipv4address ({dec_octet}"."){3}{dec_octet} 
h16   ([[:xdigit:]]{1,4}) 
ls32   ({h16}:{h16}|{ipv4address}) 
ipv6address (({h16}:){6}{ls32}|::({h16}:){5}{ls32}|({h16})?::({h16}:){4}{ls32}|(({h16}:){0,1}{h16})?::({h16}:){3}{ls32}|(({h16}:){0,2}{h16})?::({h16}:){2}{ls32}|(({h16}:){0,3}{h16})?::{h16}:{ls32}|(({h16}:){0,4}{h16})?::{ls32}|(({h16}:){0,5}{h16})?::{h16}|(({h16}:){0,6}{h16})?::) 

Clause de non-responsabilité: non testé.

+0

+1 Voir aussi mon article: [Validation de l'URI de l'expression régulière] (http://www.jmrware.com/articles/2009/uri_regexp/URI_regex.html) qui inclut des regexes pour IPv6 et tous les autres composants URI spécifiés dans [RFC-3986] (http://tools.ietf.org/html/rfc3986). – ridgerunner

Questions connexes