已验证IP地址的最佳方式是什么?我有一种验证参数IP地址的方法。作为整体开发的新手,我想知道是否有更好的方法来做到这一点。//////检查IP地址,将接受0.0.0.0作为有效IP/////////publicBooleanCheckIPValid(StringstrIP){//用“.”分割字符串,检查数组长度是否为3字符chrFullStop='.';字符串[]arrOctets=strIP.Split(chrFullStop);如果(arrOctets.Length!=4){返回false;}//检查每个子字符串,检查int值是否小于255,即char[]lengthis!>2Int16MAXVALUE=255;Int32温度;//解析返回Int32foreach(StringstrOctetinarrOctets){if(strOctet.Length>3){returnfalse;}temp=int.Parse(strOctet);如果(温度>最大值){返回假;}}返回真;这很简单(我能做到),但它似乎可以解决问题。IPAddress.TryParse方法的一个限制是它验证字符串是否可以转换为IP地址,因此如果它提供像“5”这样的字符串值,它会将其视为“0.0.0.5”。另一种验证IPv4的方法可能如下:publicboolValidateIPv4(stringipString){if(String.IsNullOrWhiteSpace(ipString)){returnfalse;}string[]splitValues=ipString.Split('.');如果(splitValues.Length!=4){返回false;}字节tempForParsing;返回splitValues.All(r=>byte.TryParse(r,outtempForParsing));}可以这样测试:ListipAddresses=newList{"2","1.2.3","1.2.3.4","255.256.267.300","127.0.0.1",};foreach(varipinipAddresses){Console.WriteLine($"{ip}==>{ValidateIPv4(ip)}");}输出将是:2==>False1.2.3==>False1.2.3.4==>True255.256.267.300==>False127.0.0.1==>True你也可以使用IPAddress.TryParse但它有它的限制可能会导致不正确的解析。System.Net.IPAddress.TryParse方法请注意,如果输入已成功解析,TryParse将返回true,但这并不一定意味着生成的IP地址是有效的IP地址。不要使用此方法来验证IP地址。但这适用于至少包含三个点的普通字符串。类似于:stringaddrString="192.168.0.1";IP地址地址;if(IPAddress.TryParse(addrString,outaddress)){//有效IP,地址包含IP}else{//无效IP}使用IPAddress。TryParse你可以检查是否有三个点,然后像这样调用TryParse:publicstaticboolValidateIPv4(stringipString){if(ipString.Count(c=>c=='.')!=3)returnfalse;IP地址地址;返回IPAddress.TryParse(ipString,输出地址);}使用System.Net;publicstaticboolCheckIPValid(stringstrIP){IPAddressresult=null;返回!String.IsNullOrEmpty(strIP)&&IPAddress.TryParse(strIP,输出结果);}你已经完成了Edit1添加了一些额外的检查以防止抛出异常(这是昂贵的)。PS它不会处理unicode。编辑2@StephenMurbyIPAddress.TryParse如果成功解析字符串,将返回true。如果您检查该方法的文档,尽管它在两种情况下会抛出异常。该字符串为空。该字符串包含unicode字符。是否要抛出异常或返回false取决于您(设计决定)。解析时,我通常更喜欢返回false而不是异常(假设这是输入不保证为真)。我说,打破return语句,字符串不为空(不为空,无论如何都不会被解析)并且IP地址被正确解析。请记住,C#布尔表达式是惰性求值的,因此如果字符串为null或空,CLR将不会尝试解析该字符串。关于缺少的if,您可以执行类似if(IP.TryParse(strIP,outresult){returntrue;}之类的操作,但您真正要做的只是说如果某事为真,则返回true。返回表达式更容易为什么不使用IPAddress.Parse或IPAddress.TryParseIPAddress.Parse(stringVarialbeContainingIP)该框架提供了IPAddress类,它又为您提供了Parse和TryParse方法。//myAddress是一个System.Net.IPAddress实例if(System.Net.IPAddress.TryParse(strIP,outmyAddress))//IP有效否则//IP无效不要使用IPAddress类并验证字节,这比Int<256方法要好得多。publicBooleanCheckIPValid(StringstrIP){//用“.”拆分字符串,检查数组长度是否为4string[]arrOctets=strIP.Split('.');如果(arrOctets.Length!=4)返回false;//检查解析到byte的每个子串byteobyte=0;foreach(stringstrOctetinarrOctets)if(!byte.TryParse(strOctet,outbyte))returnfalse;返回真;}最佳正则表达式解决方案:^((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(值,"^((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]?)$")很惊讶没有人提供正则表达式解决方案。您只需要包含System.Text.RegularExpressions。为了便于实际代码和本示例中的可读性,我总是将我的正则表达式模式拆分为一个字符串数组,然后加入它。//任何IP地址varValue="192.168.0.55";varPattern=newstring[]{"^",//字符串开始@"([01]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5]).",//在000到255之间和"."@"([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])",//和之前一样,没有句点"$",//字符串结束};//计算结果为真varMatch=Regex.IsMatch(Value,string.Join(string.Empty,Pattern));试试这个:privateboolIsValidIP(Stringip){try{if(ip==null||ip.Length==0){returnfalse;}String[]parts=ip.Split(new[]{"."},StringSplitOptions.None);如果(部分。长度!=4){返回假;}foreach(Stringsinparts){inti=Int32.Parse(s);如果((i255)){返回假;}}if(ip.EndsWith(".")){返回假;}返回真;}赶上(异常e){返回假;如果你只是想检查是否有效:boolisValid=IPAddress。TryParse(stringIP,outIPAddress_);即使它高于255并且如果是点,它也会工作,所以不需要检查一切都是关于C#学习教程:验证IP地址的最佳方法是什么?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
