验证字符串是不是对 IP 地址有效
Posted
技术标签:
【中文标题】验证字符串是不是对 IP 地址有效【英文标题】:Validate whether a string is valid for IP Address or not验证字符串是否对 IP 地址有效 【发布时间】:2015-08-06 20:01:27 【问题描述】:作为标题,我想在 C# 中验证一个字符串对于 IP 地址是否有效,并且我已经使用了
IPAddress.TryParse(value out address)
但它似乎不是那么“准确”,这意味着如果我输入"500"
,地址将是"0.0.1.244"
,因此它是“有效的”。
但是,我想接受的形式是"xxx.xxx.xxx.xxx"
,每个词都小于256
。是否有任何 API 或方法可以实现这一点?
【问题讨论】:
你可以创建你的自定义方法..你可以在那里使用这个解析方法。 查看正则表达式***.com/questions/4890789/regex-for-an-ip-address的这个答案,也可以在msdn.microsoft.com/en-us/library/…中使用IPAddress.TryParse 离题,但在设计新代码时,您也应该考虑 IPv6。 不是我已经尝试过任何东西,但正则表达式在这里没有帮助吗? 可能感兴趣:IPv4AddressHelper 【参考方案1】:您可以非常直接地检查它:将字符串拆分为以点分隔的部分,并确保它恰好是四个部分,其值在 1...255 范围内:
string s = "123.123.123.123";
var parts = s.Split('.');
bool isValid = parts.Length == 4
&& !parts.Any(
x =>
int y;
return Int32.TryParse(x, out y) && y > 255 || y < 1;
);
【讨论】:
谢谢!我认为这正是我想要的。 在 "a12.123.123.123" 上它会失败,并且不会返回 false @ArsenMkrtchyan 合理。虽然它会抛出异常。已修改代码。 另外我认为条件应该是这样的 Int32.TryParse(x, out y) && y >= 1 && y @ArsenMkrtchyan 不同意。看看这里:!parts.Any(
并注意否定运算符。【参考方案2】:
类似的东西:
private static Boolean IsIP(String value)
if (String.IsNullOrEmpty(value))
return false;
var items = value.Split('.');
if (items.Length != 4)
return false;
// Simplest: you may want use, say, NumberStyles.AllowHexSpecifier to allow hex as well
return items.All(item => byte.TryParse(item, out _));
【讨论】:
坦率地说,用Byte.TryParse
检查地址的每一部分是不够的,因为0会被成功解析为字节,所以这会将“0.0.1.244”视为有效地址。
@AndyKorneyev 0
有效。听说过127.0.0.1
?【参考方案3】:
如果您不想自己进行解析,NuGet 包IPAddressRange 将为您完成。它还具有支持 IPv6 地址的优势。
您可以查看source code and documentation here。
【讨论】:
【参考方案4】:如果您不依赖 TryParse,这里是匹配 xxx.xxx.xxx.xxx 的一种方法
public static bool MyIP(string value)
var x = value.Split('.');
if (!(x.Length==4))
return false;
foreach(var i in x)
int q;
if (!Int32.TryParse(x, out q)||q.ToString().Length.Equals(x.Length)
|| q < 0 || q > 255)
return false;
return true;
【讨论】:
y 是什么?它在哪里定义或声明 @ahmedsafan86:- 更新了我的答案! 你还有 y.Length,请修复它。【参考方案5】:string addrString = "192.168.0.1";
IPAddress address;
if (IPAddress.TryParse(addrString, out address))
//Valid IP, with address containing the IP
else
//Invalid IP
【讨论】:
在您的解决方案中添加一些解释总是一个好主意。 K先生,我会记住这一点,下次回答别人问题时会关注【参考方案6】:您可以尝试您已经在做的事情,事先做一个简短的测试,以确保字符串中有正确数量的“.”。 https://msdn.microsoft.com/en-us/library/system.net.ipaddress.tryparse.aspx
它将确定字符串是否为有效的 IPv4 地址,这不适用于 IPv6:
var stringToCheck = "192.168.1.1";
var countDots = stringToCheck.Split('.').Length - 1;
if (countDots==3)
IPAddress validIpAddress;
if (IPAddress.TryParse(stringToCheck, out validIpAddress))
//Valid IP, with validIpAddress containing the IP
Console.WriteLine("Valid IP");
else
//Invalid IP
Console.WriteLine("Invalid IP");
else
// Invalid as no "." in string, not even worth checking
Console.WriteLine("Invalid IP not correct number Dots");
【讨论】:
它确实为"500"
返回了true
,这肯定不是一个有效的IP 地址。
我已经编辑了我的答案,以检查“。”在 stringToCheck以上是关于验证字符串是不是对 IP 地址有效的主要内容,如果未能解决你的问题,请参考以下文章