【发布时间】:2016-01-31 21:16:39
【问题描述】:
起初,我认为在 Internet 上找到仅匹配公共 IPv4 地址的正则表达式很容易。然而,经过大量的谷歌搜索,我什么也没得到,所以我尝试 编写正则表达式,如下(Perl 风格),
[0-9]\.(?:[0-9]{1,3}\.){2}[0-9]{1,3}|
1[1-9]\.(?:[0-9]{1,3}\.){2}[0-9]{1,3}|
[2-9][0-9]\.(?:[0-9]{1,3}\.){2}[0-9]{1,3}|
1[0-6][0-9]\.(?:[0-9]{1,3}\.){2}[0-9]{1,3}|
17[0-1]\.(?:[0-9]{1,3}\.){2}[0-9]{1,3}|
172\.0\.(?:[0-9]{1,3}\.)[0-9]{1,3}|
172\.1[0-5]\.(?:[0-9]{1,3}\.)[0-9]{1,3}|
(172\.3[2-9]\.)(?:[0-9]{1,3}\.)[0-9]{1,3}|
(172\.[4-9][0-9]\.)(?:[0-9]{1,3}\.)[0-9]{1,3}|
...
正则表达式似乎不准确且效率低下,有人有更好的方法来编写正则表达式吗?
【问题讨论】:
-
metacpan.org/pod/Regexp::Common::net#RE-net-IPv4 将匹配 IPv4 地址。我不会将“公共”检查放入正则表达式中。
-
你想做什么?
127\.\d{1,3}\.\d{1,3}\.\d{1,3}不公开!! -
我已经通过
.s 断开了字符串,然后检查了过去if (($sections[0] == 192 && $sections[1] == 168) || ($sections[0] == 172 && ($sections[1] >= 16 && $sections[1] <= 32)) || ($sections[0] == 10)) {中的每个值。你用什么语言运行这个? (还有那个条件是检查你的请求的逆;如果匹配它就是私有的)。 -
@chris85 你只检查私有 IP 地址,而不是公共 IP 地址。
-
是的,反过来,你使用的语言不支持
else?
标签: regex