首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅匹配公共IPv4地址的正则表达式

仅匹配公共IPv4地址的正则表达式
EN

Stack Overflow用户
提问于 2015-10-31 23:07:45
回答 5查看 12.1K关注 0票数 3

起初,我认为在互联网上很容易找到只与公共IPv4地址匹配的正则表达式。然而,经过大量的googling搜索,我什么也没有得到,所以我尝试编写正则表达式,如下所示(Perl风格),

代码语言:javascript
复制
[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}|
...

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

EN

回答 5

Stack Overflow用户

发布于 2016-08-29 04:56:38

试试这个:

代码语言:javascript
复制
^([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])$

It 不匹配这个无效的ips:

代码语言:javascript
复制
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

It 本地IP不匹配:

代码语言:javascript
复制
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地址。我不能说我真的做了很多测试,所以欢迎您的建议

票数 10
EN

Stack Overflow用户

发布于 2015-11-01 00:15:57

我更愿意捕获每个八位字节,并检查子网是否在代码中是私有的,而不是使用正则表达式。然而,我对你的问题很感兴趣。

根据Wikipedia的说法,内网IP地址有3个范围。

代码语言:javascript
复制
10.0.0.0    - 10.255.255.255
172.16.0.0  - 172.31.255.255
192.168.0.0 - 192.168.255.255

现在假设你没有疯狂的类似IP的字符串,比如55.300.666.1,你可以使用负后视来做你想做的事情:

代码语言:javascript
复制
(\d+)(?<!10)\.(\d+)(?<!192\.168)(?<!172\.(1[6-9]|2\d|3[0-1]))\.(\d+)\.(\d+)

让我们再看一遍,为了清楚起见,添加了一些换行符:

代码语言:javascript
复制
(\d+)(?<!10)
\.(\d+)(?<!192\.168)(?<!172\.(1[6-9]|2\d|3[0-1]))
\.(\d+)\.(\d+)

第一行检查第一个二进制八位数是否不是10。第二行检查前2个八位字节是否为192.168,或者是否位于172.16172.31之间。第三行没有什么特别的。Regex101

PS:我知道127.0.0.1是本地主机,但我不知道它是否是私有的(我不是网络工程师)。你可能不得不根据需要即兴发挥。

票数 6
EN

Stack Overflow用户

发布于 2017-09-25 14:53:56

如果您希望验证纯公有IPv4地址,我们可以消除所有Reserved IPv4 addresses,如下所示:

  • 0.0.0.0/8:当前network
  • 10.0.0.0/8:私有network
  • 100.64.0.0/10:共享地址Space
  • 127.0.0.0/8:Loopback
  • 169.254.0.0/16:Link-local
  • 172.16.0.0/12:私有network
  • 192.0.0.0/24:IETF协议Assignments
  • 192.0.2.0/24:TEST-NET-1,文档和examples
  • 192.88.99.0/24:广播到网络中继(包括2002::/16)
  • 192.168.0.0/16:专用网络基准tests
  • 198.51.100.0/24:IPv4 -NET-2、文档和examples
  • 203.0.113.0/24:测试-NET-3、文档和examples
  • 224.0.0.0/4:IP多播(以前的D类network)
  • 240.0.0.0/4:保留(以前的E类network)
  • 255.255.255.255:IPv6

(列表摘自)

这可以放入一个不使用lookbehinds的简单正则表达式中(因此,这个正则表达式可以在JavaScript中使用):

代码语言:javascript
复制
(^0\.)|(^10\.)|(^100\.6[4-9]\.)|(^100\.[7-9]\d\.)|(^100\.1[0-1]\d\.)|(^100\.12[0-7]\.)|(^127\.)|(^169\.254\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^192\.0\.0\.)|(^192\.0\.2\.)|(^192\.88\.99\.)|(^192\.168\.)|(^198\.1[8-9]\.)|(^198\.51\.100\.)|(^203.0\.113\.)|(^22[4-9]\.)|(^23[0-9]\.)|(^24[0-9]\.)|(^25[0-5]\.)

同样,这也假设您事先已经验证过它实际上是一个有效的IPv4地址。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33453057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档