正则表达式仅匹配公共 IPv4 地址 [英] Regex to ONLY match PUBLIC IPv4 address

查看:24
本文介绍了正则表达式仅匹配公共 IPv4 地址的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

起初,我认为在互联网上很容易找到只匹配公共 IPv4 地址的正则表达式.然而,经过大量的谷歌搜索,我一无所获,所以我尝试编写正则表达式,如下(Perl 风格),

At first, I thought it's easy to find the regex which only matches public IPv4 address on the Internet. However, after tons of googling,I got nothing,so I try to write the regex,as follows(Perl flavor),

[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}|
...

正则表达式似乎不准确且效率低下,有人有更好的方法来编写正则表达式吗?

The regex seems inaccurate and inefficient , does someone have a better way to write the regex?

推荐答案

试试这个:

^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?<!172\.(16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31))(?<!127)(?<!^10)(?<!^0)\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?<!192\.168)(?<!172\.(16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31))\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?<!\.255$)$

它正确不匹配这个无效的ips:

It correctly doesn't match this invalid ips:

999.999.999.999.
108.0.0.01
0.1.2.3
00.0000.00.00
192.168.l.1
912.456.123.123
.3.3.3.0
192.168.o.0

不匹配本地 IP:

172.16.0.9
172.16.4.1
172.17.1.1
127.0.0.2
10.0.1.5
10.0.0.1
10.155.155.155
10.255.255.254
172.16.0.4
172.16.0.1
172.17.1.1
172.31.254.254
192.168.1.2
192.168.254.0

最后它不匹配广播IP:

60.123.247.255
196.168.255.255
10.255.255.255
192.168.255.255

并且几乎匹配我测试过的每个 IP.不能说我真的做了很多测试,所以欢迎提出建议

And matches pretty much every IP i've tested. Can't say I really done a lot of testing, so i'm welcome for suggestions

这篇关于正则表达式仅匹配公共 IPv4 地址的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆