正則表示式驗證合法的IP地址
阿新 • • 發佈:2018-12-23
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位或者兩位數字,即0~99;
- 任何一個以1開頭的3位數字,即100~199;
- 任何一個以2開頭,第二位數字在0~4之間的數字即200~249;
- 任何一個以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})$