【发布时间】:2013-01-16 07:37:14
【问题描述】:
我有一个 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 地址格式。我无法弄清楚如何修复正则表达式以丢弃此类值。非常感谢任何帮助。
【问题讨论】:
-
你能解释一下所提供的反面例子有什么问题吗?
-
上面的例子已经解释过了。每组用“:”隔开代表16位。最后四组用“.”隔开表示 8 位。总位数为 64 + 32 = 96 位。缺少 32 位。
-
嗯,它也接受 ::0:999.999.999.999 之类的废话。
-
我有代码检查 ipv4 部分是否为
标签: c regex networking ipv6 flex-lexer