IPV4地址由4个组数字组成,每组数字之间以.分隔,每组数字的取值范围是0-255。IPV4必须满足以下四条规则:
- 任何一个1位或2位数字,即0-99;
- 任何一个以1开头的3位数字,即100-199;
- 任何一个以2开头、第2位数字是0-4之间的3位数字,即200-249;
- 任何一个以25开头,第3位数字在0-5之间的3位数字,即250-255。
这样把规则全部罗列出来之后,构造一个正则表达式的思路就清晰了。
- 首先满足第一条规则的正则是:\d{1,2}
- 首先满足第二条规则的正则是:1\d{2}
- 首先满足第三条规则的正则是:2[0-4]\d
- 首先满足第四条规则的正则是:25[0-5]
把它们组合起来,就得到一个匹配0-255数字的正则表达式了: (\d{1,2})|(1\d{2})|(2[0-4]\d)|( 25[0-5])
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])) 。
方法如下:
////// 验证一个字符串是否为IPV4 /// /// 要验证的字符串 ///返回结果,是IPV4返回true,不是IPV4返回false 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)) 。
所以方法如下:
////// 验证一个字符串是否为IPV4 /// /// 要验证的字符串 ///返回结果,是IPV4返回true,不是IPV4返回false 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; } }
扩展
验证字符串能否转换成有效端口号:
////// 验证字符串是否可转换成有效的端口号 /// /// 字符串 ///返回结果,能转换返回true,不能转换返回false 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; } }