3

以下に示すように、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]*

これは正しく、IPv6 アドレスのすべての形式です。

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

レガシー形式の IPv6 アドレスの理想的な例は次のとおりです。

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 ".".`

通常の IPv6 アドレスの 8 つのグループとは対照的に、これは、最後の 4 つのグループが「.」で区切られているためです。IPv6 アドレスの最下位 32 ビットに圧縮する必要があります。したがって、128 ビットを満たすには 10 個のグループが必要です。

ただし、次のアドレス形式を使用すると

   2001:1234:4563:3210:5.6.7.8

ここで、「:」で区切られた各グループは 16 ビットを表します。「.」で区切られた最後の 4 つのグループ。は 8 ビットを表します。合計ビット数は 64 + 32 = 96 ビットです。32 ビットが欠落しています。

正規表現はそれを有効な IPv6 アドレス形式として受け入れています。そのような値を破棄するように正規表現を修正する方法がわかりません。どんな助けも大歓迎です。

4

1 に答える 1

5

RFC 3986で指定され、その後RFC 5954で確認された IPv6 アドレスの文法は次のとおりです。

 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

これを使用して、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})?::)

免責事項: テストされていません。

于 2013-02-01T04:07:56.760 に答える