1. 程式人生 > >正則表示式驗證合法的IP地址

正則表示式驗證合法的IP地址

IPv4地址

最初設計網際網路絡時,為了便於定址和層次化構造網路,每個IP地址包括兩個標識碼(ID),即網路ID和主機ID。同一個物理網路上的所有主機都使用同一個網路ID,網路上的一個主機(包括網路上的工作站,伺服器和路由器等)有一個主機ID與其對應。Internet委員會定義了5種IP地址型別以適應不同容量的網路,即A類~E類。

類別 IP地址範圍 最大網路數 最大主機數 私有IP地址範圍
A 0.0.0.0~127.255.255.255 126(2^7 - 2)(A類地址的字首為"0",網路ID標識碼的位數為8位,網路號不能全為0且127.0.0.0網路保留用於迴路測試,所以最大網路數為2^7-2) 16777214(2^24 - 2 ) 10.0.0.0~10.255.255.255
B 128.0.0.0~191.255.255.255 16384(2^14) (B類地址的字首為"10",網路ID標識碼的位數為16位,因此最大網路數為(2^14)) 65534(2^16 - 2) 172.16.0.0~172.31.255.255
C 192.0.0.0~223.255.255.255 2097152(2^21)(C類地址的字首為"110",網路ID標誌碼的位數為24位,因此最大網路數為(2^21)) 254(2^8 - 2) 192.168.0.0~192.168.255.255
D 224.0.0.0~239.255.255.255 D類地址的字首為"1110"
E 240.0.0.0~255.255.255.255 E類地址的字首為"1111"

IPv4地址由4組數字組成,每組數字之間以.分隔,每組數字的取值範圍是0~255.

IPv4必須滿足以下四條規則:

  1. 任何一個1位或者兩位數字,即0~99;
  2. 任何一個以1開頭的3位數字,即100~199;
  3. 任何一個以2開頭,第二位數字在0~4之間的數字即200~249;
  4. 任何一個以25開頭,第三位數字在0~5之間的三位數字,即250~255;

首先滿足第一條規則的正則是:

((\d{1,2})

滿足第二條規則的正則是:

(1\d{1,2})

滿足第三條規則的正則是:

(2[0-4]\d)

滿足第四條規則的正則是:

(25[0-5])

將其組合起來就能得到一個能匹配0~255的正則表示式了:

((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))

IPv4地址由4個這樣的數字組成,中間用"."隔開,所以可以匹配IPv4的正則表示式為:

(((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))

使用邊界匹配,不然256.1.1.1也會匹配成功,會匹配成56.1.1.1,那麼最終正確的匹配IPv4的正則表示式為:

(?=(\b|\D))(((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{1,2})|(2[0-4]\d)|(25[0-5]))(?=(\b|\D))

 IPv6地址

IPv6的128位地址通常寫成8組,每4組為4個十六進位制數。比如:AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一個合法的IPv6地址。這個地址比較長,看起來不方便也不易於書寫。零壓縮法可以用來縮減其長度。如果幾個連續段位的值都是0,那麼這些0就可以簡單的一::來表示,上述地址就可以寫成AD80::ABAA:0000:00C2:0002.這裡需要注意的是隻能簡化連續的段位的0,其前後的0都要保留,比如AD80的最後的這個0,不能被簡化。當然也可以在ABAA後面使用::,這樣的話前面的12個0就不能壓縮了。這個限制的目的是為了能準確的還原被壓縮的0,不然就無法確定每個::代表多少個0.

支援IPv6基本格式的正則表示式:

^([\\da-fA-F]{1,4}:){7}([\\da-fA-F]{1,4})$