所以我需要匹配一个可能有也可能没有掩码的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的正则表达式。

有帮助吗?

解决方案

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

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

RFC 3986 部分了解有关IPv6地址的最佳位置3.2.2。

其他提示

你是什么意思,你不能只使用图书馆?模块怎么样? Regexp :: IPv6 将为您提供所需的信息

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

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

这主要有用......

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

缺点: :: ,例如未正确处理的案件

试试这个:

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

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

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

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

if (/(([\da-f]{0,4}:{0,2}){1,8})/i) { print("$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/

这里有一个适用于我设法找到的所有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://wwwcommunity.helpsystems的.com /论坛/ intermapper /杂项课题/ 5acc4fcf-fa83-e511-80cf-0050568460e4

从问题页面,社区页面和维基百科网站上的所有示例进行验证:

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

用于验证的工具是从这里使用的:

https://regex101.com/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top