IPv6 验证正则表达式和有效/无效地址的收集

问题描述 投票:0回答:0

我正在做一个项目,旨在收集一组最好的 IPv6 地址验证正则表达式。我最大的问题是我不擅长正则表达式。

IPv6 的问题在于它的符号变化很大。这意味着虽然正则表达式可能适用于您的用例,但它可能会遗漏其他极端情况。在这种情况下,我只想匹配 IPv6 地址,而不是它们的 CIDR 表示法表亲。

所以我的问题是:

  • 您知道的最佳 IPv6 地址(非 CIDR)验证 REGEX 是什么?
  • 你最喜欢的/你发现的最困难的角落案例是什么?

我不是在寻找在这种情况下使用的库 - 我只想要正则表达式。

测试用例

以下是我目前收集到的有效/无效测试用例:

正则表达式尝试

这是我迄今为止收集的正则表达式的集合,但到目前为止所有这些都错过了测试用例,例如 IPv4 中的 IPv6 寻址符号,或者它们也匹配无效地址。

尝试 1 - 在 IPv6 中遗漏 IPv4

^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$

尝试 2 - 错过了太多测试,无法列出

^(?:[A-f0-9]{1,4}:){7}[A-f0-9]{1,4}|(?=(?:[A-f0-9]{0,4}:){2,8}(?::\d{1,3}\.){3}\d{1,3}$)(([0-9a-fA-F]{1,4}(:)){1,6}|:(:[0-9a-fA-F]{1,4}(:)){1,5}|((([0-9a-fA-F]{1,4}:){1,6})|((:[0-9a-fA-F]{1,4}){1,6}))(?:(:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?:\/\d\d?)|\b|$))$

尝试 3 - 遗漏以 ::

结尾的地址
^(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$

尝试 4 - 遗漏 IPv6 中的 IPv4 和包含接口名称的符号,匹配许多无效地址,部分匹配字符串

(([0-9a-fA-F]{0,4}:){1,7}[0-9a-fA-F]{0,4})

尝试 5 - 遗漏具有区域索引的地址,匹配一些无效地址

(?:^|(?<=\s))(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))(?=\s|$)

感谢您分享您的知识和经验!

regex networking network-programming ipv6
© www.soinside.com 2019 - 2024. All rights reserved.