Regex 如何将IPv6地址与Perl正则表达式匹配?

Regex 如何将IPv6地址与Perl正则表达式匹配?,regex,perl,ipv6,Regex,Perl,Ipv6,所以我需要匹配一个ipv6地址,它可能有也可能没有掩码。不幸的是,我不能仅仅使用库来解析字符串 掩码位非常简单,在这种情况下: (?:\/\d{1,3})?$/ 困难的部分是ipv6地址的不同格式。它需要搭配牛肉、牛肉、牛肉等 更新:我就快到了 /^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:(

所以我需要匹配一个ipv6地址,它可能有也可能没有掩码。不幸的是,我不能仅仅使用库来解析字符串

掩码位非常简单,在这种情况下:

(?:\/\d{1,3})?$/
困难的部分是ipv6地址的不同格式。它需要搭配牛肉、牛肉、牛肉等

更新:我就快到了

/^(\:\:([a-f0-9]{1,4}\:){0,6}?[a-f0-9]{0,4}|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){0,6}?\:\:|[a-f0-9]{1,4}(\:[a-f0-9]{1,4}){1,6}?\:\:([a-f0-9]{1,4}\:){1,6}?[a-f0-9]{1,4})(\/\d{1,3})?$/i
在本例中,我仅限于使用perl的正则表达式。

尝试以下方法:

^([0-9a-fA-F]{4}|0)(\:([0-9a-fA-F]{4}|0)){7}$


您还应该阅读以下内容:

我不是IPv6专家,但请相信我,当我告诉您使用您建议的非常简单的正则表达式来匹配(更不用说验证)IPv6地址并不容易时。将地址与端口相结合有许多速记和各种约定,仅举一个例子。其中一种速记方式是,您可以将0:0:0:0:0:0:1写成::1,但还有更多。如果您阅读德语,我建议您阅读第11期德语Perl研讨会上的幻灯片


你说你不能使用一个库,但是如果你想重新设计库的整个复杂性,那么你最好将它逐字导入到你的项目中。

你说不能只使用库是什么意思?模块怎么样?将为您提供所需。

包含Regexp::Common的补丁,演示了一个完整、准确、经过测试的IPv6正则表达式。这是IPv6语法的直译。这也很准确

更重要的是,它包含一个测试套件。用你的正则表达式运行它表明你还有很长的路要走。19人中有10人错过了比赛。12个假阳性中有1个。IPv6包含许多特殊的速记,因此很容易出错


阅读IPv6地址的最佳位置是第3.2.2节。

如果需要在perl中检查字符串是否为IPv6地址,可以尝试以下方法:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") };
这主要是有效的

^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$
缺点:
类似未正确处理的案例

尝试:

/^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/ai
发件人:

以下是一个适用于我找到的所有IPv6示例的示例:

/^\s*((([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}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
使用前请确保它是一行。 在这里可以找到:

在问题页面、社区页面和wikipedia站点的所有示例上进行了验证:

正在使用的验证工具如下所示:


我使用的语言是perl。允许使用其他库所需的更改将是更多的工作。定义作业?我在家工作。这是为了我正在进行的一个项目——如果你是说为了教育目的,那么就不是了。“允许使用其他图书馆所需要的改变将是更多的工作。”——我对此表示怀疑。至少从长远来看不是这样。一般来说,不使用CPAN模块的Perl只是语言的一半。甚至拒绝使用简单的纯Perl模块,然后向其他人寻求以前解决的问题的解决方案似乎。。。效率低下。有什么变化?要么
使用SomeModule
,要么你去CPAN,下载这个模块,然后复制粘贴。只是有些方法比其他方法好得多。理想情况下,这些方法不应该包括要求其他人重做已经完成的工作。如果你想找到另一种方法,那就发疯吧,但你现在也要求我们参与进来。这与2001:db8:85a3:0:0:8a2e:370:7334 2001:db8:85a3::8a2e:370:7334 2001:0db8:0000:0000:0000:0000::1428:57ab::ffff:c00:280和其他一些不匹配。有人知道这是否有Python版本吗?@jcollie那些正则表达式没有使用任何有趣的Perl功能。它们应该是在日志文件中对Python.worked的机械翻译。甚至给了我以下几行
命令通道监听::1#xxx//在[::]创建的DNS套接字,FD 3//在本地接受NAT拦截的HTTP套接字连接=[::]:xxxx远程=[::]FD 4 flags=33//在本地接受HTTP套接字连接=[::]:xxxx远程=[:]FD 5 flags=8//监听::1//监听xxxx::xxxx:xxxx:xxxx:xxxx%eth0//监听xxxx::xxxx:xxxx:xxxx:xxxx%eth1//为用户管理员打开的会话@::ffff:xxx.xxx.xxx