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。
- 该字符串为null。
- 该字符串包含unicode字符。
由您决定(设计决策)是否要抛出exception或返回false。 在解析时,我通常更喜欢返回false而不是exception(假设这是输入不保证是正确的)。
我说,打破退货声明,
- 该字符串不为null(也不为空,无论如何都不会解析) AND
- IP地址正确解析。
记住C#布尔表达式是惰性求值的 ,因此如果字符串为null
或为空,CLR将不会尝试解析该字符串。
关于失踪的if,你可以做点什么,
if (IP.TryParse(strIP, out result) { return true; }
但你真正做的就是说如果事情是真的,那就回归真实。 更容易直接返回表达式。
为什么不使用IPAddress.Parse或IPAddress.TryParse
IPAddress.Parse(stringVarialbeContainingIP)
该框架提供了IPAddress
类,后者又为您提供了Parse
和TryParse
方法。
// 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并且如果有点,它也会有效,所以不需要检查它。