【问题标题】:regular expression for IPV6 address in CIDR notationCIDR 表示法中 IPV6 地址的正则表达式
【发布时间】: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)。这种模式甚至可以编译吗?顺便说一句,在单独的规则中跳过空格可能是一个更好的主意。在每个标记的末尾添加空格通常效果不佳。

标签: regex ip-address ipv6 lex cidr


【解决方案1】:

我已经设法获得了 IPV6 地址的正则表达式,如下所示。

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

我已经测试了上述内容,它正在工作。谢谢。

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多