CIDR 表示法中 IPV6 地址的正则表达式
Posted
技术标签:
【中文标题】CIDR 表示法中 IPV6 地址的正则表达式【英文标题】:regular expression for IPV6 address in CIDR notation 【发布时间】:2012-12-13 05:55:09 【问题描述】:我正在尝试编写一个 lex 模式,它允许我识别 IPV6 地址,包括带有 CIDR 表示法的 IPV6 地址。我使用的模式如下所示。
IPV4ADDRESS_CIDR [ \t]*(((2(5[0-5]|[0-4][0-9])|[01]?[0-9][0-9]?)\.)3(2(5[0-5]|[0-4][0-9])|[01]?[0-9][0-9]?)(\/(3[012]|[12]?[0-9])))[ \t]*
IPV4ADDRESS [ \t]*(([[:digit:]]1,3".")3([[:digit:]]1,3))[ \t]*
hex4 ([[:xdigit:]]1,4)
hexseq (hex4(:hex4)*)
hexpart (hexseq|(hexseq::(hexseq?))|::hexseq)
IPV6ADDRESS [ \t]*(hexpart(":"IPV4ADDRESS)?)[ \t]*
IPV6ADDRESS_CIDR [ \t]*(IPV6ADDRESS)(\/(1[01][0-9]|12[0-8]|[0-9]1,2))[ \t]*
IPV6ADDRESS_CIDR 的正则表达式没有按预期工作。我正在测试
2001:1234::5678:5:6:7:8/64
它似乎无法正确识别它。我在这里犯了一些错误吗?
【问题讨论】:
首先,您的 IPV6ADDRESS_CIDR 节点似乎只匹配前缀长度≤32,而它需要匹配 0 到 128 之间的任何内容。其次,您没有计算十六进制组的数量,所以您要去允许一些无效的东西,如 1:2:3:4:5:6:7:8:9 (太多部分)。最后,还有一些特殊情况可能会遗漏,例如以 :: 开头或以 :: 结尾的地址(包括全零地址“::”本身)。 我已经编辑了正则表达式以将前缀长度扩展到 我已经编辑了正则表达式以将前缀长度扩展为 您似乎没有正确引用所有文字字符(::
和各种数字),或者就此而言,将所有定义名称放入
(IPV6ADDRESS
)。这种模式甚至可以编译吗?顺便说一句,在单独的规则中跳过空格可能是一个更好的主意。在每个标记的末尾添加空格通常效果不佳。
【参考方案1】:
我已经设法获得了 IPV6 地址的正则表达式,如下所示。
IPV6ADDRESS_CIDR [ \t]IPV6ADDRESS(/(1[01][0-9]|12[0-8]|[0-9]1,2))[ \t]
我已经测试了上述内容,它正在工作。谢谢。
【讨论】:
以上是关于CIDR 表示法中 IPV6 地址的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
用于验证 IPv4 和 IPv6 地址的 Javascript 正则表达式,没有主机名