.NET中的IP地址解析

3
我正在使用IPAddress.TryParse()方法解析IP地址。但它有些过于宽容(解析“1”返回0.0.0.1)。我想将输入限制为点分十进制表示法。最好的方法是什么?
(注意:我正在使用.NET 2.0)
编辑
让我澄清一下:
我正在编写一个应用程序,将扫描一系列IP地址以查找某些设备(基本上是端口扫描器)。当用户输入“192.168.0.1”作为起始地址时,我希望自动填充“192.168.0.255”作为结束地址。问题在于,当他们键入“1”时,它会解析为“0.0.0.1”,并且结束地址填充为“0.0.0.255” - 看起来很滑稽。

你是想解析还是验证?解析"1"应该返回0.0.0.1 - 除非你试图验证输入数据是否为IP地址,否则我不明白你所说的“太宽容”是什么意思。 - Andrew Hare
两者都需要。我需要验证用户输入的是否为点分十进制,并将其转换为System.Net.IPAddress。 - Jon B
2个回答

8

如果你对解析格式感兴趣,我建议使用正则表达式。这是一个很好的正则表达式(来源):

bool IsDottedDecimalIP(string possibleIP)
{
    Regex R = New Regex(@"\b(?:\d{1,3}\.){3}\d{1,3}\b");
    return R.IsMatch(possibleIP) && Net.IPAddress.TryParse(possibleIP, null);
}

这个正则表达式不能捕获无效的IP地址,但可以强制执行您的模式。而TryParse函数则检查它们是否有效。


编译不通过...存在无效的转义字符。我太菜了,不会调试正则表达式 :( - Jon B
Regex.IsMatch(SubjectString, "\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b") 正则表达式.IsMatch(主题字符串, "\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b") - Diadistis
或@"\b(?:\d{1,3}\.){3}\d{1,3}\b"或"\b(?:\d{1,3}\.){3}\d{1,3}\b" - Diadistis
@Diadistis - 我尝试过了,但是没有成功,后来发现我传递的字符串也是错误的。我想你需要同时把所有东西都搞对 :) - Jon B
谢谢,Jon - 我总是在这个网站上忘记“@”。 - Michael Haren

0

IP地址实际上是一个32位的数字 - 它不是xxx.xxx.xxx.xxx - 这只是同样内容的人类可读格式。因此,IP地址1实际上是0.0.0.1。

编辑:鉴于澄清,您可以选择使用正则表达式,或者按照自己的喜好格式化快捷方式,因此如果您希望“1”显示为“1.0.0.0”,则可以附加该内容并仍然使用解析方法。


1
没错,但是当用户输入“1”时,他可能不是想要“0.0.0.1”。 - Jon B

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