validationIP地址的最佳方法是什么?

我有一个方法来validation参数IP地址。 作为一个整体发展的新手,我想知道是否有更好的方法来做到这一点。

///  /// Check IP Address, will accept 0.0.0.0 as a valid IP ///  ///  ///  public Boolean CheckIPValid(String strIP) { // Split string by ".", check that array length is 3 char chrFullStop = '.'; string[] arrOctets = strIP.Split(chrFullStop); if (arrOctets.Length != 4) { return false; } // Check each substring checking that the int value is less than 255 and that is char[] length is !> 2 Int16 MAXVALUE = 255; Int32 temp; // Parse returns Int32 foreach (String strOctet in arrOctets) { if (strOctet.Length > 3) { return false; } temp = int.Parse(strOctet); if (temp > MAXVALUE) { return false; } } return true; } 

它很简单(我可以做到),但它似乎做了伎俩。

IPAddress.TryParse方法的限制是它validation字符串是否可以转换为IP地址,因此如果它提供了类似"5"的字符串值,则将其视为"0.0.0.5"

另一种validationIPv4的方法可能如下:

 public bool ValidateIPv4(string ipString) { if (String.IsNullOrWhiteSpace(ipString)) { return false; } string[] splitValues = ipString.Split('.'); if (splitValues.Length != 4) { return false; } byte tempForParsing; return splitValues.All(r => byte.TryParse(r, out tempForParsing)); } 

它可以测试如下:

 List ipAddresses = new List { "2", "1.2.3", "1.2.3.4", "255.256.267.300", "127.0.0.1", }; foreach (var ip in ipAddresses) { Console.WriteLine($"{ip} ==> {ValidateIPv4(ip)}"); } 

输出将是:

 2 ==> False 1.2.3 ==> False 1.2.3.4 ==> True 255.256.267.300 ==> False 127.0.0.1 ==> True 

您也可以使用IPAddress.TryParse但它有其局限性,可能导致解析不正确。

System.Net.IPAddress.TryParse方法

请注意,如果成功解析输入,TryParse将返回true,但这并不一定意味着生成的IP地址是有效的IP地址。 请勿使用此方法validationIP地址。

但这适用于包含至少三个点的普通字符串。 就像是:

 string addrString = "192.168.0.1"; IPAddress address; if (IPAddress.TryParse(addrString, out address)) { //Valid IP, with address containing the IP } else { //Invalid IP } 

使用IPAddress.TryParse您可以检查是否存在三个点,然后调用TryParse如:

 public static bool ValidateIPv4(string ipString) { if (ipString.Count(c => c == '.') != 3) return false; IPAddress address; return IPAddress.TryParse(ipString, out address); } 
 using System.Net; public static bool CheckIPValid(string strIP) { IPAddress result = null; return !String.IsNullOrEmpty(strIP) && IPAddress.TryParse(strIP, out result); } 

你已经完成了

编辑1

添加了一些额外的检查以防止抛出exception(这是很昂贵的)。 PS它不会处理unicode。

编辑2

@StephenMurby如果IPAddress.TryParse成功解析了字符串,它将返回true 。 如果您检查方法的文档 ,虽然它会在两种情况下抛出exception。

  1. 该字符串为null。
  2. 该字符串包含unicode字符。

由您决定(设计决策)是否要抛出exception或返回false。 在解析时,我通常更喜欢返回false而不是exception(假设这是输入不保证是正确的)。

我说,打破退货声明,

  1. 该字符串不为null(也不为空,无论如何都不会解析) AND
  2. IP地址正确解析。

记住C#布尔表达式是惰性求值的 ,因此如果字符串为null或为空,CLR将不会尝试解析该字符串。

关于失踪的if,你可以做点什么,

 if (IP.TryParse(strIP, out result) { return true; } 

但你真正做的就是说如果事情是真的,那就回归真实。 更容易直接返回表达式。

为什么不使用IPAddress.Parse或IPAddress.TryParse

 IPAddress.Parse(stringVarialbeContainingIP) 

该框架提供了IPAddress类,后者又为您提供了ParseTryParse方法。

 // myAddress is a System.Net.IPAddress instance if (System.Net.IPAddress.TryParse(strIP , out myAddress)) // IP is valid else // IP isn't valid 

不使用IPAddress类并validation字节,这比Int <256方法好得多。

  public Boolean CheckIPValid(String strIP) { // Split string by ".", check that array length is 4 string[] arrOctets = strIP.Split('.'); if (arrOctets.Length != 4) return false; //Check each substring checking that parses to byte byte obyte = 0; foreach (string strOctet in arrOctets) if (!byte.TryParse(strOctet, out obyte)) return false; return true; } 

最好的Regex解决方案:

 ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$ 

C#

 Regex.IsMatch(value, "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$") 

惊讶没有人提供Regex解决方案。 您只需要包含System.Text.RegularExpressions。 为了便于实际代码和本例中的可读性,我总是把我的正则表达式模式分成一个字符串数组然后加入它。

  // Any IP Address var Value = "192.168.0.55"; var Pattern = new string[] { "^", // Start of string @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.", // Between 000 and 255 and "." @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.", @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])\.", @"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])", // Same as before, no period "$", // End of string }; // Evaluates to true var Match = Regex.IsMatch(Value, string.Join(string.Empty, Pattern)); 

试试这个:

 private bool IsValidIP(String ip) { try { if (ip == null || ip.Length == 0) { return false; } String[] parts = ip.Split(new[] { "." }, StringSplitOptions.None); if (parts.Length != 4) { return false; } foreach (String s in parts) { int i = Int32.Parse(s); if ((i < 0) || (i > 255)) { return false; } } if (ip.EndsWith(".")) { return false; } return true; } catch (Exception e) { return false; } } 

如果您只想检查是否有效,请执行以下操作:

bool isValid = IPAddress.TryParse(stringIP, out IPAddress _);

即使它高于255并且如果有点,它也会有效,所以不需要检查它。