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

博客讨论了如何创建一个正则表达式来匹配IPv4地址,特别是公共IP地址。作者遇到了挑战,因为正则表达式需要排除私有和保留的IP地址范围。文章提到了不同的IP地址范围,如10.0.0.0/8、172.16.0.0/12和192.168.0.0/16等,并提供了多个正则表达式示例,但指出这些可能不完全准确或高效。评论中提供了改进正则表达式的建议,并讨论了如何在代码中进一步验证IP地址的私有性。
摘要由CSDN通过智能技术生成

起初,我认为很容易找到仅与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}不是公开的!

我已经用.打破了字符串,然后检查了过去if (($sections[0] == 192 && $sections[1] == 168) || ($sections[0] == 172 && ($sections[1] >= 16 && $sections[1] <= 32)) || ($sections[0] == 10)) {中的每个值。 您使用哪种语言运行? (同样,该条件正在检查您请求的逆向;如果匹配则为私有)。

@ chris85您只需检查私有IP地址,而不是公共IP地址。

是的,相反,您使用的语言不支持else?

@ Agawa001 172不是127. :)

@ chris85我正在使用编辑器进行搜索,而不是语言。

这里有一个类似的问题stackoverflow.com/questions/2284750/

@Ramana链接无法解决我的问题。

使用regexp验证IPv4地址的可能重复项

试试这个:

^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?

正确与此无效的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。不能说我真的做了很多测试,所以欢迎提出建议

我宁愿捕获每个八位位组,并检查子网是否在代码中私有,而不是使用正则表达式。但是,您的问题让我很感兴趣。

根据Wikipedia的介绍,私有IP地址有3个范围。

10.0.0.0    - 10.255.255.255

172.16.0.0  - 172.31.255.255

192.168.0.0 - 192.168.255.255

现在假设您没有像55.300.666.1这样的类似于IP的疯狂字符串,则可以使用负向后查找来执行您想要的操作:

(\d+)(?

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

(\d+)(?

\.(\d+)(?

\.(\d+)\.(\d+)

第一行检查第一个八位位组不是10。第二行检查前两个八位字节是否不是192.168或在172.16和172.31之间。第三行没有什么特别的。 Regex101

PS:我确实知道127.0.0.1是localhost,但是我不知道它是否是私有的(我不是网络工程师)。您可能需要根据需要即兴创作。

我在Solarwinds中使用了您的正则表达式语句来查找具有公共IP地址的设备。 效果很好。 谢谢。

从127.0.0.1到127.255.255.255的整个IP范围不被视为公共IP地址,并且不应与公共IP范围匹配。

Anubioz的+ Irvin Lim =

^(?!^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]\.)(([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])\.([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]))$

https://i.stack.imgur.com/vWtlj.png

(不广播)

如果您要验证纯公共IPv4地址,则可以按以下步骤删除所有保留的IPv4地址:

0.0.0.0/8:当前网络

10.0.0.0/8:专用网络

100.64.0.0/10:共享地址空间

127.0.0.0/8:回送

169.254.0.0/16:本地链接

172.16.0.0/12:专用网络

192.0.0.0/24:IETF协议分配

192.0.2.0/24:TEST-NET-1,文档和示例

192.88.99.0/24:从IPv6到IPv4中继(包括2002 :: / 16)

192.168.0.0/16:专用网络

198.18.0.0/15:网络基准测试

198.51.100.0/24:TEST-NET-2,文档和示例

203.0.113.0/24:TEST-NET-3,文档和示例

224.0.0.0/4:IP多播(以前的D类网络)

240.0.0.0/4:保留(以前的E类网络)

255.255.255.255:广播

(摘录自维基百科)

可以将其放入一个不使用后置行为的简单正则表达式中(因此,该正则表达式可以在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地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值