验证字符串是否为有效的IP地址

IPV4地址由4个组数字组成,每组数字之间以.分隔,每组数字的取值范围是0-255。IPV4必须满足以下四条规则:

  1. 任何一个1位或2位数字,即0-99;
  2. 任何一个以1开头的3位数字,即100-199;
  3. 任何一个以2开头、第2位数字是0-4之间的3位数字,即200-249;
  4. 任何一个以25开头,第3位数字在0-5之间的3位数字,即250-255。 

这样把规则全部罗列出来之后,构造一个正则表达式的思路就清晰了。

  1. 首先满足第一条规则的正则是:\d{1,2}
  2. 首先满足第二条规则的正则是:1\d{2}
  3. 首先满足第三条规则的正则是:2[0-4]\d
  4. 首先满足第四条规则的正则是: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])) 

方法如下:

/// <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))

所以方法如下:

        /// <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;
            }
        }

扩展

验证字符串能否转换成有效端口号:

        /// <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;
            }
        }


posted @ 2015-01-31 09:35  <码仔>  阅读(439)  评论(0编辑  收藏  举报