【摘要】
多個(gè)市場(chǎng)要求無(wú)線4G網(wǎng)管全面支持IPv6,在開(kāi)發(fā)過(guò)程中,遇到大量需要做IPv6校驗(yàn)的地方,本文通過(guò)正則表達(dá)式解決IPv6校驗(yàn)的問(wèn)題,來(lái)介紹正則表達(dá)式最基本的用法,幫助大家入門(mén),打消對(duì)正則表達(dá)式的心理恐懼。
【關(guān)鍵詞】
IPv6,正則表達(dá)式
1背景
在學(xué)習(xí)正則表達(dá)式時(shí),有一個(gè)美式笑話:
“Some people, when confronted with a problem, think“I know, I’ll use regular expressions.”Now they have two problems.”
當(dāng)你意識(shí)到一個(gè)問(wèn)題可以用正則表達(dá)式來(lái)解決時(shí),你就有兩個(gè)問(wèn)題了,因?yàn)檎齽t表達(dá)式本身就是一個(gè)big problem。2012年6月6日,全球范圍內(nèi)的IPv6網(wǎng)絡(luò)正式啟動(dòng),IPv6的應(yīng)用已經(jīng)是大勢(shì)所趨。本文通過(guò)正則表達(dá)式解決IPv6校驗(yàn)的問(wèn)題,來(lái)介紹正則表達(dá)式最基本的用法,幫助大家入門(mén)。
正則表達(dá)式(Regular expressions)本質(zhì)上是一個(gè)微小的且高度專業(yè)化的編程語(yǔ)言,它被嵌入到高級(jí)語(yǔ)言中供程序員使用。正則表達(dá)式通過(guò)指定一些規(guī)則來(lái)描述那些你希望匹配的字符串集合,比如Email地址,IP地址。正則表達(dá)式的強(qiáng)大之處在于一些特殊符號(hào)的應(yīng)用,特殊符號(hào)定義了字符集合、子組匹配、模式重復(fù)次數(shù)。如果沒(méi)有這些特殊字符,正則表達(dá)式就和大多數(shù)文本編輯器中的Ctrl+F一樣平庸,僅僅只是匹配純字符而已。
2實(shí)踐情況
2.1正則表達(dá)式特殊字符說(shuō)明
正則字符包括保留字(. ^ $ * + ? { } [ ] ( ) \ |)和其它字符,下面列出最常用的正則表達(dá)式特殊字符的詳細(xì)含義:
下邊列舉了由字符'\'和另一個(gè)字符組成的特殊含義。注意,'\' +元字符的組合可以解除元字符的特殊功能
2.2正則表達(dá)式特殊字符的4個(gè)角色
為方便記憶,可以按字符的功能,分為4個(gè)角色:
2.3常用正則表達(dá)式
2.4正則表達(dá)式在高級(jí)語(yǔ)言中的應(yīng)用
以python中的re模塊和java中的java.util.regex為例,做一個(gè)對(duì)比,展示正則表達(dá)式在高級(jí)語(yǔ)言中的一些常用用法。
2.5IPv4表示法
IP地址的長(zhǎng)度為32b(bit),分為4段,每段8位,用十進(jìn)制數(shù)字表示,每段數(shù)字范圍為0~255,段與段之間用英文句點(diǎn)“.”隔開(kāi)。例如:某臺(tái)計(jì)算機(jī)IP地址為111.22.33.4。
分析IP地址的組成特點(diǎn):250-255、200-249、0-199。這三種情況可以分開(kāi)考慮:
250-255:三位數(shù),百位是2,十位是5,個(gè)位是0~5,用正則表達(dá)式可以寫(xiě)成:25[0-5]
200-249:三位數(shù),百位是2,十位是0~4,個(gè)位是0~9,用正則表達(dá)式可以寫(xiě)成:2[0-4]\d
0-199:這個(gè)可以繼續(xù)分拆:
l0-9: 一位數(shù),個(gè)位是0~9,用正則表達(dá)式可以寫(xiě)成:\d
l10-99:二位數(shù),十位是1~9,個(gè)位是0~9,用正則表達(dá)式可以寫(xiě)成:[1-9]\d
l100-199:三位數(shù),百位是1,十位是0~9,個(gè)位是0~9,用正則表達(dá)式可以寫(xiě)成:1\d{2}
于是0-99的正則表達(dá)式可以合寫(xiě)為[1-9]?\d,那么0-199用正則表達(dá)式就可以寫(xiě)成(1\d{2})|([1-9]?\d),這樣0~255的正則表達(dá)式就可以寫(xiě)成(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
最后,后面3段加上句點(diǎn).可以使用{3}重復(fù)得到,得到IP地址的正則表達(dá)式,可以寫(xiě)成如下形式,2種均可:
2.6IPv6表示法
IPv6的地址長(zhǎng)度為128b(bit),是IPv4地址長(zhǎng)度的4倍。采用十六進(jìn)制表示。IPv6有3種表示方法:
分析IPv6地址的特點(diǎn),可以歸納如下:
標(biāo)準(zhǔn)十六進(jìn)制表示法(包括前導(dǎo)0省略) | 純數(shù)字格式: | ([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:) |
2001:0008:0009:0023:0008:0800:8888:9999 | ||
純字母格式: | ||
ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD:ABCD | ||
數(shù)字和字母混合格式: | ||
ABCD:EF01:2345:6789:ABCD:EF01:2345:6789 | ||
格式中前面帶0: | ||
2001:0DB8:0000:0023:0008:0800:200C:417A | ||
格式中前面每一位為0: | ||
0001:0DB8:0000:0023:0008:0800:000C:017A | ||
全0: | ||
0000:0000:0000:0000:0000:0000:0000:0000 | ||
多位0在中間:如fec0:1:0:0:0:0:0:1234 | ||
多位0在前面:如0:0:0:0:0:1234:fec0:1 | ||
多位0在最后:如1234:fec0:1:0:0:0:0:0 | ||
全0:0:0:0:0:0:0:0:0 | ||
全0:0:000:0:0:0:0:0:0 | ||
全0:0:00:0:0:0:0:0:0 | ||
全0:0:0000:0:0:0:0:0:0 | ||
前導(dǎo)0省略位置遍歷 | ||
1個(gè)位置前導(dǎo)0省略: | ||
ABCD:EF01:2345:6789:ABCD:EF01:2345:1 | ||
ABCD:EF01:2345:6789:ABCD:EF01:2:9999 | ||
ABCD:EF01:2345:6789:ABCD:2:EF01:9999 | ||
ABCD:EF01:2345:6789:2:ABCD:EF01:9999 | ||
ABCD:EF01:2345:2:6789:ABCD:EF01:9999 | ||
ABCD:EF01:2:2345:6789:ABCD:EF01:9999 | ||
ABCD:2:EF01:2345:6789:ABCD:EF01:9999 | ||
2:ABCD:EF01:2345:6789:ABCD:EF01:9999 | ||
其他前導(dǎo)0省略情況: | ||
89:DB8:0:23:8:800:C:417 | ||
89:DB8:0:23:8:800:0C:417 | ||
89:DB8:0:23:8:800:00C:417 | ||
89:DB8:0:23:8:800:000C:417 | ||
2001:DB8:0:23:8:800:000C:417A | ||
0位壓縮表示法 | ABCD:EF01:2345:6789:ABCD:EF01:8.8.8.9 | (([0-9A-Fa-f]{1,4}:){6}(((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:[0-9A-Fa-f]{1,4}|:)) |
(左起有6個(gè)位置用標(biāo)準(zhǔn)16進(jìn)制表示) | ABCD:EF01:2345:6789:ABCD:EF01::EF01 | |
ABCD:EF01:2345:6789:ABCD:EF01:: | ||
0位壓縮表示法 | ABCD:EF01:2345:6789:ABCD::8.8.8.9 | (([0-9A-Fa-f]{1,4}:){5}(:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|((:[0-9A-Fa-f]{1,4}){1,2})|:)) |
(左起有5個(gè)位置用標(biāo)準(zhǔn)16進(jìn)制表示) | ABCD:EF01:2345:6789:ABCD::EF01 | |
ABCD:EF01:2345:6789:ABCD::EF01:EF01 | ||
ABCD:EF01:2345:6789:ABCD:: | ||
0位壓縮表示法 | ABCD:EF01:2345:6789::EF01:8.8.8.9 | (([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,3})|:)) |
(左起有4個(gè)位置用標(biāo)準(zhǔn)16進(jìn)制表示) | ABCD:EF01:2345:6789::8.8.8.9 | |
ABCD:EF01:2345:6789::EF01 | ||
ABCD:EF01:2345:6789::EF01:EF01 | ||
ABCD:EF01:2345:6789::EF01:EF01:EF01 | ||
ABCD:EF01:2345:6789:: | ||
0位壓縮表示法 | ABCD:EF01:2345::8.8.8.9 | (([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,4})|:)) |
(左起有3個(gè)位置用標(biāo)準(zhǔn)16進(jìn)制表示) | ABCD:EF01:2345::EF01:8.8.8.9 | |
ABCD:EF01:2345::EF01:EF01:8.8.8.9 | ||
ABCD:EF01:2345::EF01 | ||
ABCD:EF01:2345::EF01:EF01 | ||
ABCD:EF01:2345::EF01:EF01:EF01 | ||
ABCD:EF01:2345::EF01:EF01:EF01:EF01 | ||
ABCD:EF01:2345:: | ||
0位壓縮表示法 | ABCD:EF01::8.8.8.9 | (([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,5})|:)) |
(左起有2個(gè)位置用標(biāo)準(zhǔn)16進(jìn)制表示) | ABCD:EF01::EF01:8.8.8.9 | |
ABCD:EF01::EF01:EF01:8.8.8.9 | ||
ABCD:EF01::EF01:EF01:EF01:8.8.8.9 | ||
ABCD:EF01::EF01 | ||
ABCD:EF01::EF01:EF01 | ||
ABCD:EF01::EF01:EF01:EF01 | ||
ABCD:EF01::EF01:EF01:EF01:EF01 | ||
ABCD:EF01::EF01:EF01:EF01:EF01:EF01 | ||
ABCD:EF01:: | ||
0位壓縮表示法 | ABCD::8.8.8.9 | (([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,6})|:)) |
(左起有1個(gè)位置用標(biāo)準(zhǔn)16進(jìn)制表示) | ABCD::EF01:8.8.8.9 | |
ABCD::EF01:EF01:8.8.8.9 | ||
ABCD::EF01:EF01:EF01:8.8.8.9 | ||
ABCD::EF01:EF01:EF01:EF01:8.8.8.9 | ||
ABCD::EF01 | ||
ABCD::EF01:EF01 | ||
ABCD::EF01:EF01:EF01 | ||
ABCD::EF01:EF01:EF01:EF01 | ||
ABCD::EF01:EF01:EF01:EF01:EF01 | ||
ABCD::EF01:EF01:EF01:EF01:EF01:EF01 | ||
ABCD:: | ||
0位壓縮表示法 | ::8.8.8.9 | (:(((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|((:[0-9A-Fa-f]{1,4}){1,7})|:)) |
(左起開(kāi)始?jí)嚎s) | ::EF01:8.8.8.9 | |
::EF01:EF01:8.8.8.9 | ||
::EF01:EF01:EF01:8.8.8.9 | ||
::EF01:EF01:EF01:EF01:8.8.8.9 | ||
::EF01:EF01:EF01:EF01:EF01:8.8.8.9 | ||
::EF01 | ||
::EF01:EF01 | ||
::EF01:EF01:EF01 | ||
::EF01:EF01:EF01:EF01 | ||
::EF01:EF01:EF01:EF01:EF01 | ||
::EF01:EF01:EF01:EF01:EF01:EF01 | ||
::EF01:EF01:EF01:EF01:EF01:EF01:EF01 | ||
:: |
綜上,得出IPv6地址的完整正則表達(dá)式為:
3效果評(píng)價(jià)
對(duì)于日常開(kāi)發(fā)中只接觸IPv4,并沒(méi)有深入研究過(guò)正則表達(dá)式的開(kāi)發(fā)者,面對(duì)IPv6和正則表達(dá)式,容易產(chǎn)生畏懼心理,覺(jué)得是兩座難以翻越的大山。本文通過(guò)一些表格整理對(duì)IPv6的表示方法,以及正則表達(dá)式的特殊符號(hào)進(jìn)行了分類和說(shuō)明,帶領(lǐng)大家快速入門(mén)IPv6和正則表達(dá)式。
4推廣建議
本文所述IPv6正則表達(dá)式已經(jīng)過(guò)測(cè)試,可以直接拿到各個(gè)高級(jí)語(yǔ)言中應(yīng)用。
-
IPv6
+關(guān)注
關(guān)注
6文章
690瀏覽量
59406 -
編程語(yǔ)言
+關(guān)注
關(guān)注
10文章
1945瀏覽量
34735
原文標(biāo)題:干貨 | IPv6正則表達(dá)式攻略
文章出處:【微信號(hào):ZTEdeveloper,微信公眾號(hào):中興開(kāi)發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論