所以我需要匹配一个可能有也可能没有掩码的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节.
我不是IPv6专家,但是当我告诉你用一个非常简单的正则表达式(如你建议的那个)来匹配(更不用说验证)IPv6地址时,请相信我.将地址与端口相结合有很多简短和各种约定,仅举一个例子.一种这样的简写是你可以将0:0:0:0:0:0:0:1写为:: 1,但还有更多.如果您阅读德语,我建议您在第11届德国Perl研讨会上查看Steffen Ullrich的演讲.
你说你不能使用库,但是如果你要重新发明库的整个复杂性,那么你也可以将它逐字地导入到你的项目中.