【问题标题】: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 或方法可以实现这一点?

【问题讨论】:

标签: c# string


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2014-09-02
    • 2014-07-25
    相关资源
    最近更新 更多