CIDR表示法下IPv6地址的正则表达式

6
我正在尝试编写一个lex模式,以便识别包括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 

它似乎不能正确识别它。我在这里犯了什么错误吗?

1
首先,你的IPV6ADDRESS_CIDR节点似乎只匹配前缀长度≤32,而它需要匹配0到128之间的任何内容。其次,你没有计算十六进制组的数量,因此会允许一些无效的东西,比如1:2:3:4:5:6:7:8:9(部分过多)。最后,有一些特殊情况被你忽略了,比如以::开头或以::结尾的地址(包括全零地址“::”本身)。 - Celada
我已经编辑了正则表达式,将前缀长度扩展到<=128而不是<=32。 - liv2hak
我已经编辑了正则表达式,将前缀长度扩展到<=128而不是<=32。我稍后会修复组计数问题。目前它只取前8个组。现在我仍然无法正确地使用CIDR模式。 - liv2hak
1
你似乎没有正确引用所有的字面字符(::和各种数字),或者说将所有的定义名称都放在 {}IPV6ADDRESS )内。那个模式甚至能编译吗?顺便说一句,在单独的规则中跳过空格可能是一个更好的主意;在每个令牌的末尾添加空格通常不会很好地工作。 - rici
1个回答

0

我已经成功获取了IPv6地址的正则表达式,如下所示。

IPV6ADDRESS_CIDR [ \t]{IPV6ADDRESS}(/(1[01][0-9]|12[0-8]|[0-9]{1,2}))[ \t]

我已经测试过上述内容,并且它是有效的。谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接