本文介紹了使用正則表達(dá)式匹配四種常見(jiàn)ip地址格式的方法。1. ipv4地址由四組0到255之間的數(shù)字組成,每組用點(diǎn)分隔,例如192.168.1.1,其正則表達(dá)式為b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b;2. 帶子網(wǎng)掩碼的ipv4地址在ipv4基礎(chǔ)上加了一個(gè)斜杠和數(shù)字部分,表示子網(wǎng)掩碼位數(shù),例如192.168.0.0/24,其正則表達(dá)式為b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(3[0-2]|[12][0-9]|[0-9])b;3. ipv6地址由8段1~4位十六進(jìn)制數(shù)組成,例如簡(jiǎn)化版正則表達(dá)式為b([0-9a-fa-f]{1,4}:){7}[0-9a-fa-f]{1,4}b,但該表達(dá)式不支持雙冒號(hào)縮寫(xiě);4. ipv4映射的ipv6地址以::ffff:開(kāi)頭,后接ipv4地址,例如::ffff:192.168.1.1,其正則表達(dá)式為b::ffff:((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b。
匹配IP地址是很多網(wǎng)絡(luò)處理任務(wù)中常見(jiàn)的需求,比如日志分析、數(shù)據(jù)清洗或者防火墻規(guī)則設(shè)置。正則表達(dá)式(Regex)是一個(gè)非常合適的工具來(lái)完成這個(gè)任務(wù)。但I(xiàn)P地址有不同格式(IPv4、帶子網(wǎng)掩碼的IPv4、IPv6等),每種寫(xiě)法都有不同的匹配方式。
下面介紹四種常見(jiàn)的IP地址格式及其對(duì)應(yīng)的正則表達(dá)式寫(xiě)法,方便你在實(shí)際場(chǎng)景中靈活使用。
IPv4 地址:x.x.x.x
這是最常見(jiàn)的IPv4地址格式,由四組0到255之間的數(shù)字組成,每組用點(diǎn)分隔。例如:192.168.1.1 或 8.8.8.8。
要正確匹配這類(lèi)地址,不能簡(jiǎn)單地只看有沒(méi)有四個(gè)數(shù)字和三個(gè)點(diǎn),還要確保每個(gè)數(shù)字段在0~255之間。
正則表達(dá)式:
b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b
說(shuō)明:
- b 表示單詞邊界,避免匹配到其他包含IP形式的字符串。
- 每個(gè)數(shù)字段分為三類(lèi):
- 25[0-5] 匹配250~255
- 2[0-4][0-9] 匹配200~249
- [01]?[0-9][0-9]? 匹配0~199(支持前導(dǎo)0和省略前導(dǎo)0的情況)
- 最后一個(gè)分組沒(méi)有點(diǎn),所以單獨(dú)列出
帶子網(wǎng)掩碼的IPv4地址:x.x.x.x/xx
這種格式常用于路由或配置文件中,表示一個(gè)IP地址加上子網(wǎng)掩碼位數(shù),例如:192.168.0.0/24
正則表達(dá)式:
b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(3[0-2]|[12][0-9]|[0-9])b
說(shuō)明:
- / 后面的部分是子網(wǎng)掩碼位數(shù),取值范圍是0到32
- 所以用 (3[0-2]|[12][0-9]|[0-9]) 來(lái)限制合法范圍
- 這是在IPv4表達(dá)式基礎(chǔ)上加了一個(gè)斜杠和數(shù)字部分
IPv6 地址:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
IPv6地址比IPv4復(fù)雜得多,支持縮寫(xiě)(如省略前導(dǎo)0、雙冒號(hào)代替連續(xù)的0段),因此正則匹配也更復(fù)雜。
簡(jiǎn)化版正則表達(dá)式(不支持所有縮寫(xiě)):
b([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}b
說(shuō)明:
- 每段為1~4位十六進(jìn)制數(shù)(0-9和a-f,不區(qū)分大小寫(xiě))
- 總共8段,用冒號(hào)分隔
- 該表達(dá)式不支持雙冒號(hào)縮寫(xiě)(如 ::1),如果需要完整支持,正則會(huì)變得非常長(zhǎng)且復(fù)雜,通常建議使用專(zhuān)門(mén)的庫(kù)處理IPv6
IPv4映射的IPv6地址:::ffff:x.x.x.x
有時(shí)候你會(huì)看到類(lèi)似 ::ffff:192.168.1.1 的地址,這是IPv6中表示IPv4地址的一種方式。
正則表達(dá)式:
b::ffff:((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)b
說(shuō)明:
- 開(kāi)頭固定為 ::ffff:,后面接IPv4地址
- 因此可以復(fù)用前面IPv4的正則部分,前面加上固定的前綴即可
基本上就這些常見(jiàn)格式了。根據(jù)你的具體使用場(chǎng)景選擇合適的形式。如果你只是做基礎(chǔ)提取,IPv4和IPv4帶掩碼的兩種可能已經(jīng)夠用;如果涉及IPv6,建議配合專(zhuān)用庫(kù)進(jìn)行驗(yàn)證,因?yàn)檎齽t很難覆蓋所有合法縮寫(xiě)形式。