我有一个用于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位中。因此,我们需要10个组来满足128位。
但是,如果我使用以下地址格式
2001:1234:4563:3210:5.6.7.8
这里每个由“:”分隔的组表示16位。由“.”分隔的最后四个组表示8位。总比特数为64 + 32 = 96位。缺失32位。
正则表达式将其接受为有效的IPv6地址格式。我无法弄清楚如何修复正则表达式以丢弃这些值。非常感谢任何帮助。