所以我需要匹配一个可能有也可能没有掩码的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的regex。
9条答案
按热度按时间8oomwypt1#
This包含Regexp::Common的修补程序,演示了完整、准确、经过测试的IPv6正则表达式。它是IPv6语法的直接翻译。Regexp::IPv6也是准确的。
更重要的是,它包含了一个测试套件。用正则表达式运行它会发现你还差得远。19次中有10次错过。12次中有1次误报。IPv6包含了很多特殊的速记,这使得它很容易出现微妙的错误。
要了解IPv6地址的组成部分,最好阅读RFC 3986第3.2.2节。
gstyhher2#
你说不能只使用一个库是什么意思?模块怎么样?
Regexp::IPv6
会给予你你所需要的。nuypyhwy3#
我不是IPv6Maven,但是请相信我,用一个非常简单的正则表达式(比如您建议的正则表达式)来匹配(更不用说验证)IPv6地址并不容易。有许多简写和各种约定来组合地址和端口,这里仅举一个例子。其中一个简写是您可以将0:0:0:0:0:0:0:1写为::1,但还有更多。如果您懂德语,我建议您看一下第11届德语Perl研讨会上的Steffen Ullrich's talk幻灯片。
你说你不能使用一个库,但是如果你打算重新发明这个库的整个复杂性,那么你也可以把它逐字地导入到你的项目中。
ecbunoof4#
这基本上是可行的...
缺点:
::
类病例未正确处理qlfbtfca5#
请尝试:
发件人:http://home.deds.nl/~aeron/regex/
yv5phkfx6#
试试看:
从Regular Expression Library: IPv6 address开始
您还应阅读以下内容:A Regular Expression for IPv6 Addresses
zmeyuzjn7#
如果您需要在perl中检查字符串是否为IPv6地址,可以尝试以下操作:
mrphzbgm8#
下面是我设法找到的适用于所有IPv6示例的方法:
在使用前请确保它是一行。它可以在以下位置找到:
https://community.helpsystems.com/forums/intermapper/miscellaneous-topics/5acc4fcf-fa83-e511-80cf-0050568460e4
从问题页面、社区页面和维基百科网站的所有示例中进行验证,请访问:
https://en.wikipedia.org/wiki/IPv6
使用的验证工具为以下工具:
https://regex101.com/
2q5ifsrm9#
这是一个综合性的IPv6正则表达式,用于测试所有有效的IPv6文本表示法(expanded、compressed、expanded-mixed、compressed mixed)以及可选的前缀长度。它还将各个部分捕获到捕获组中。可以通过在捕获组的左括号后面放置
?:
来跳过捕获组。附加IPv4正则表达式: