IPV4地址由4个组数字组成,每组数字之间以.分隔,每组数字的取值范围是0-255。IPV4必须知足如下四条规则:正则表达式
这样把规则所有罗列出来以后,构造一个正则表达式的思路就清晰了。spa
把它们组合起来,就获得一个匹配0-255数字的正则表达式了: (\d{1,2})|(1\d{2})|(2[0-4]\d)|( 25[0-5])code
IPV4由四组这样的数字组成,中间由.隔开,或者说由三组数字和字符.和一组数字组成,因此匹配IPV4的正则表达式以下: (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5])) 。ip
方法以下:字符串
/// <summary> /// 验证一个字符串是否为IPV4 /// </summary> /// <param name="ip">要验证的字符串</param> /// <returns>返回结果,是IPV4返回true,不是IPV4返回false</returns> private bool IsCorrectIP(string ip) { string pattrn = @"(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))"; if (System.Text.RegularExpressions.Regex.IsMatch(ip, pattrn)) { return true; } else { return false; } }
这个正则有一个缺陷,就是若是不使用边界匹配的话,像字符串 255.255.0.256也会被匹配到,匹配到的结果是255.255.0.25。能够添加限制条件,先后要么是边界,要么是非数字,而且使用先后查找(lookaround)。即: (?<=(\\b|\\D))(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))(?=(\\b|\\D)) 。string
因此方法以下:
/// <summary> /// 验证一个字符串是否为IPV4 /// </summary> /// <param name="ip">要验证的字符串</param> /// <returns>返回结果,是IPV4返回true,不是IPV4返回false</returns> private bool IsCorrectIP(string ip) { string pattrn = "(?<=(\\b|\\D))(((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)" +"|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)" +"|(25[0-5]))(?=(\\b|\\D))"; if (System.Text.RegularExpressions.Regex.IsMatch(ip, pattrn)) { return true; } else { return false; } }
扩展it
验证字符串可否转换成有效端口号:io
/// <summary> /// 验证字符串是否可转换成有效的端口号 /// </summary> /// <param name="port">字符串</param> /// <returns>返回结果,能转换返回true,不能转换返回false</returns> private bool IsCorrectPort(string port) { try { int p = int.Parse(port); if (p>65535||p<0) { return false; } else { return true; } } catch (Exception) { return false; } }