5

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

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

(?:\/\d{1,3})?$/

困难的部分是 ipv6 地址的不同格式。它需要匹配 ::beef、beef::、beef::beef 等。

更新:我快到了..

/^(\:\:([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 的正则表达式。

4

8 回答 8

13

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

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

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

于 2009-11-28T01:05:46.240 回答
10

你是什​​么意思你不能只使用图书馆?一个模块怎么样?Regexp::IPv6会给你你需要的。

于 2009-11-26T11:02:38.537 回答
5

我不是 IPv6 专家,但是当我告诉您使用非常简单的正则表达式(例如您建议的正则表达式)来匹配(更不用说验证)IPv6 地址时,请相信我。将地址与端口组合起来有许多简写和各种约定,仅举一个例子。一种这样的速记是您可以将 0:0:0:0:0:0:0:1 写为 ::1,但还有更多。如果您阅读德语,我建议您查看Steffen Ullrich在第 11 届德语 Perl 研讨会上的演讲幻灯片。

您说您不能使用库,但如果您要重新发明库的整个复杂性,那么您也可以将它逐字导入您的项目中。

于 2009-11-26T10:18:16.430 回答
2

这主要工作...

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

缺点:::像没有正确处理的情况

于 2011-04-20T13:02:55.173 回答
1

试试这个:

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

来自正则表达式库:IPv6 地址

您还应该阅读以下内容:IPv6 地址的正则表达式

于 2009-11-26T10:01:59.877 回答
1

如果你需要在 perl 中检查一个字符串是否是一个 IPv6 地址,你可以试试这个:

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$1") };
于 2011-04-04T06:52:13.033 回答
1

尝试:

/^(((?=(?>.*?(::))(?!.+\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

来自: http ://home.deds.nl/~aeron/regex/

于 2012-01-22T09:42:48.167 回答
1

这是适用于我设法找到的所有 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*$/

使用前确保它是一条线。在这里找到:

https://community.helpsystems.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4

在问题页面、社区页面和维基百科网站的所有示例中验证:

https://en.wikipedia.org/wiki/IPv6

用于验证的工具来自此处:

https://regex101.com/

于 2017-04-14T12:40:51.767 回答