如何在C#中验证IP地址

5

我正在开发一个使用IP地址的应用程序。我需要验证它们至少从1.0.0.1开始,但使用下面的代码时,它接受0.0.0.0:

\b(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]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

我也尝试将其更改为:
\b(25[0-5]|2[0-4][0-9]|[01]?[1-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]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

这段代码不接受0.0.0.0,但也不接受100.0.0.0到109.0.0.0之间的地址。

有人能提供帮助吗?


请学习如何正确格式化你的问题。 - ba__friend
如果您正在使用正则表达式,请记录-1来说明。什么是“bt”?为什么格式这么差?请阅读:http://stackoverflow.com/editing-help - spender
7
@spender,@ba_friend:为什么不帮助编辑帖子以改善格式而不是只抱怨呢?你们两个都有足够的声望来提供帮助! - xan
1
但是真的需要是-1吗?笔记不就是为了这个吗?你要培养并获取信息,一个得分低于100分的人不会一开始就知道网站如何运作。帮助他们成长并成为社区的一部分。我马上就下台了。我认为这是一个持续的辩论。我会看看这个在元数据上是否有讨论。我理解作为一个社区网站,我们对内容负责,但是对于一个新手来说,在他们开始之前就被打了-2的分数。我们如何用如此严苛的理念来发展社区。今天培养一个新手。你会感觉好多了。 - Luke Duddridge
使用IPaddress.tryparse来为IPv6做好准备,避免更多的痛苦! - clamchoda
显示剩余5条评论
3个回答

10

使用

IPAddress addr = IPAddress.TryParse(str);

然后,如果那个方法行得通,使用以下代码获取数字

addr.GetAddressBytes();

然后使用普通的if条件语句检查正确情况的字节值。


2
顺便提一下,它也将1验证为真,并将IP地址设置为0.0.0.1。 - Mubashar
是的,“1”是一个有效的IP地址,意味着0.0.0.1。 - Anders Forsgren
2
对于网络专家来说,这可能是可以理解的,但对于非专业用户在应用程序上进行输入文本框验证是不希望的。 - Mubashar
问题是如何验证地址中的每个字节是否具有适当的值。在这种特定情况下,要求至少为1.0.0.1,这只能从包含四个八位组的字符串中实现。如果您想接受任何 IP地址但要验证用户是否输入了所有四个八位组,则以此方式解析将不足够。 - Anders Forsgren
2
我已经为答案投了赞,我只是为那些像我一样正在寻找IP地址字符串验证的开发人员添加了第一个注释。 :) 干杯 - Mubashar

1

免去痛苦!将其转换为字符串,以点字符为分隔符进行拆分,并检查每个4个段是否在0或1到255的范围内。

否则,如果您使用RegexBuddy(这是一个非常适合正则表达式的应用程序),它具有图书馆中的一堆IP地址示例,包括从0.0.0.0到255.255.255.255:

\b(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\b

0

试着使用这个:

ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接