验证字符串是不是对 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 地址有效的主要内容,如果未能解决你的问题,请参考以下文章

JS检测文本框中输入的IP地址是不是有效

Rails 3:验证 IP 字符串

算法判断IP地址是不是合法的,包含IPv4和IPv6

算法判断IP地址是不是合法的,包含IPv4和IPv6

MySQL如何有效的存储IP地址

MySQL如何有效的存储IP地址