晚了 10 年。感谢Mark Byers、bramp、Edward、blueyed、user3177026、Justin、karmakaze、Ron Maupin。
回答 TLDR
仅开始
请删除换行符 - 这只是为了便于阅读:
^(?:
127\.|
0?10\.|
172\.0?1[6-9]\.|
172\.0?2[0-9]\.|
172\.0?3[01]\.|
192\.168\.|
169\.254\.|
::1|
[fF][cCdD][0-9a-fA-F]{2}:|
[fF][eE][89aAbB][0-9a-fA-F]:
)
括号开头的?:表示这个括号没有被捕获,可能会让它更快一点。
请注意反斜杠。在 Postgres 例如您必须使用 E 字符串并且必须用反斜杠转义反斜杠 - 或者只使用 [.] 而不是 E'\\.'!
整个 IP(十进制,前导零可选,最多三位)
请删除换行符 - 这只是为了便于阅读:
\b(
127\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
0?10\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
172\.0?1[6-9]\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
172\.0?2[0-9]\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
172\.0?3[01]\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
192\.168\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
169\.254\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|
::1|
[fF][cCdD][0-9a-fA-F]{2}(?:[:][0-9a-fA-F]{0,4}){0,7}|
[fF][eE][89aAbB][0-9a-fA-F](?:[:][0-9a-fA-F]{0,4}){0,7}
)
(?:\/([789]|1?[0-9]{2}))?
\b
https://regex101.com/r/JCLOZL/14(备份:https://etherpad.wikimedia.org/p/JCLOZL)
详情
IPv4
127.0.0.0 to 127.255.255.255 is 127.0.0.0/8 # localhost, loopback etc.
10.0.0.0 to 10.255.255.255 is 10.0.0.0/8 # approximately/formerly class A
172.16.0.0 to 172.31.255.255 is 172.16.0.0/12 # approximately/formerly class B
192.168.0.0 to 192.168.255.255 is 192.168.0.0/16 # approximately/formerly class C
169.254.0.0 to 169.254.255.255 is 169.254.0.0/16 # link-local addresses since 2005
例子:
172.17.50.33 or more explicit:
172.17.50.33/32
我不确定斜线后面的部分是否可以有前导零(不太可能),但 IP 可以有前导零。
带前导零的 IPv4(十进制)
127.000.000.000 to 127.255.255.255 is 127.000.000.000/8 # localhost, loopback etc.
010.000.000.000 to 010.255.255.255 is 010.000.000.000/8 # approx/formerly class A
172.016.000.000 to 172.031.255.255 is 172.016.000.000/12 # approx/formerly class B
192.168.000.000 to 192.168.255.255 is 192.168.000.000/16 # approx/formerly class C
169.254.000.000 to 169.254.255.255 is 169.254.000.000/16 # link-local addresses
例子:
172.017.050.033 or more explicit:
172.017.050.033/32
带前导零的 IPv4(八进制)
我的正则表达式不支持。为了使您的程序完美,请检查并警告用户八进制 IP 地址和/或超过三位数!
0177.0000.0000.0000 to 0177.0377.0377.0377 is 0177.0000.0000.0000/8 # loopback
0012.0000.0000.0000 to 0012.0377.0377.0377 is 0012.0000.0000.0000/8 # A
0254.0020.0000.0000 to 0254.0037.0377.0377 is 0254.0020.0000.0000/12 # B
0300.0250.0000.0000 to 0300.0250.0377.0377 is 0300.0250.0000.0000/16 # C
0251.0376.0000.0000 to 0251.0376.0377.0377 is 0251.0376.0000.0000/16 # link-local
例子:
0254.0021.0062.0041 or more explicit:
0254.0021.0062.0041/32
是的,172.017.050.033 在不同的工具上与0254.0021.0062.0041 相同。在 macOS 上使用ping 测试。
当然,您还可以在某些工具中将十进制(无前导零)与八进制(至少一个前导零)混合使用。 :S
IPv6
fc00:0000:… to fdff:ffff:… is fc00::/7
fe80:0000:… to febf:ffff:… is fe80::/10 # link-local addresses
这可能不是您想要的,因为:
私有 IPv4 地址由 RFC 1918 定义,私有 Internet 的地址分配,并且这些地址在多个网络中使用。 IPv6 ULA 地址是唯一的(ULA 中的“U”),不能在多个地方重复使用,这就是它们需要在 Global ID 中具有 40 个随机位的原因,从而对唯一性有很高的期望。
来自公共 Internet 的所有地址都将在 2000:: 到 3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff (2000::/3) 的范围内。
您需要正确屏蔽地址以查看它是否在公共范围内,然后对公共范围内的非公共范围执行相同的操作。如果它通过了公共范围测试,则它必须在公共范围内的非公共范围内失败。如果它通过了所有这些,它就是一个公共地址。
IOT 设备还获得全球(公共)IPv6 地址。 IPv6 的重点是有足够的地址,每台设备上的每个接口都可以获得一个全局 IPv6 地址,从而恢复 IP 最初的设计方式(不再需要解决 NAT 问题)。
您的网络服务器内部的一些地址将是链接本地地址 (fe80::/10),并且可以为以下流量分配 ULA 地址(您可以从 fd00::/8 分配其中的fc00::/7,但有一定的限制)绝不允许在公共互联网上使用。
例子:
fdff:1234:abcd:5678:effe:9098:dcba:7654 or more explicit:
fdff:1234:abcd:5678:effe:9098:dcba:7654/128
不完整的链接列表
当我来到这里时,我不知道: