驗證字符串是否爲有效的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;
            }
        }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章