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])) 。
方法如下:
/// <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;
}
}