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 地址的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python 正则表达式将 IP 地址与 /CIDR 匹配

IP地址(IPv4)/IPv6地址的正则表达式

用于验证 IPv4 和 IPv6 地址的 Javascript 正则表达式,没有主机名

匹配所有有效格式 IPv6 地址的正则表达式

正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]

java 使用正则表达示判断是不是合法的IPV4IPV6地址