以下に示すように、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 アドレス形式として受け入れています。そのような値を破棄するように正規表現を修正する方法がわかりません。どんな助けも大歓迎です。