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

imn*_*neo 5 regex perl ipv6

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

掩码位很容易,在这种情况下:

(?:\/\d{1,3})?$/
Run Code Online (Sandbox Code Playgroud)

困难的部分是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
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我仅限于使用perl的正则表达式.

Sch*_*ern 13

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

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

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


inn*_*naM 10

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


tse*_*see 5

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

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