【摘要】
多個市場要求無線4G網管全面支持IPv6,在開發過程中,遇到大量需要做IPv6校驗的地方,本文通過正則表達式解決IPv6校驗的問題,來介紹正則表達式最基本的用法,幫助大家入門,打消對正則表達式的心理恐懼。
【關鍵詞】
IPv6,正則表達式
1背景
在學習正則表達式時,有一個美式笑話:
“Some people, when confronted with a problem, think“I know, I’ll use regular expressions.”Now they have two problems.”
當你意識到一個問題可以用正則表達式來解決時,你就有兩個問題了,因為正則表達式本身就是一個big problem。2012年6月6日,全球范圍內的IPv6網絡正式啟動,IPv6的應用已經是大勢所趨。本文通過正則表達式解決IPv6校驗的問題,來介紹正則表達式最基本的用法,幫助大家入門。
正則表達式(Regular expressions)本質上是一個微小的且高度專業化的編程語言,它被嵌入到高級語言中供程序員使用。正則表達式通過指定一些規則來描述那些你希望匹配的字符串集合,比如Email地址,IP地址。正則表達式的強大之處在于一些特殊符號的應用,特殊符號定義了字符集合、子組匹配、模式重復次數。如果沒有這些特殊字符,正則表達式就和大多數文本編輯器中的Ctrl+F一樣平庸,僅僅只是匹配純字符而已。
2實踐情況
2.1正則表達式特殊字符說明
正則字符包括保留字(. ^ $ * + ? { } [ ] ( ) \ |)和其它字符,下面列出最常用的正則表達式特殊字符的詳細含義:
下邊列舉了由字符'\'和另一個字符組成的特殊含義。注意,'\' +元字符的組合可以解除元字符的特殊功能
2.2正則表達式特殊字符的4個角色
為方便記憶,可以按字符的功能,分為4個角色:
2.3常用正則表達式
2.4正則表達式在高級語言中的應用
以python中的re模塊和java中的java.util.regex為例,做一個對比,展示正則表達式在高級語言中的一些常用用法。
2.5IPv4表示法
IP地址的長度為32b(bit),分為4段,每段8位,用十進制數字表示,每段數字范圍為0~255,段與段之間用英文句點“.”隔開。例如:某臺計算機IP地址為111.22.33.4。
分析IP地址的組成特點:250-255、200-249、0-199。這三種情況可以分開考慮:
250-255:三位數,百位是2,十位是5,個位是0~5,用正則表達式可以寫成:25[0-5]
200-249:三位數,百位是2,十位是0~4,個位是0~9,用正則表達式可以寫成:2[0-4]\d
0-199:這個可以繼續分拆:
l0-9: 一位數,個位是0~9,用正則表達式可以寫成:\d
l10-99:二位數,十位是1~9,個位是0~9,用正則表達式可以寫成:[1-9]\d
l100-199:三位數,百位是1,十位是0~9,個位是0~9,用正則表達式可以寫成:1\d{2}
于是0-99的正則表達式可以合寫為[1-9]?\d,那么0-199用正則表達式就可以寫成(1\d{2})|([1-9]?\d),這樣0~255的正則表達式就可以寫成(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))
最后,后面3段加上句點.可以使用{3}重復得到,得到IP地址的正則表達式,可以寫成如下形式,2種均可:
2.6IPv6表示法
IPv6的地址長度為128b(bit),是IPv4地址長度的4倍。采用十六進制表示。IPv6有3種表示方法:
分析IPv6地址的特點,可以歸納如下:
標準十六進制表示法(包括前導0省略) | 純數字格式: | ([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 | ||
數字和字母混合格式: | ||
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 | ||
前導0省略位置遍歷 | ||
1個位置前導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 | ||
其他前導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個位置用標準16進制表示) | 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個位置用標準16進制表示) | 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個位置用標準16進制表示) | 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個位置用標準16進制表示) | 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個位置用標準16進制表示) | 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個位置用標準16進制表示) | 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})|:)) |
(左起開始壓縮) | ::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地址的完整正則表達式為:
3效果評價
對于日常開發中只接觸IPv4,并沒有深入研究過正則表達式的開發者,面對IPv6和正則表達式,容易產生畏懼心理,覺得是兩座難以翻越的大山。本文通過一些表格整理對IPv6的表示方法,以及正則表達式的特殊符號進行了分類和說明,帶領大家快速入門IPv6和正則表達式。
4推廣建議
本文所述IPv6正則表達式已經過測試,可以直接拿到各個高級語言中應用。
-
IPv6
+關注
關注
6文章
690瀏覽量
59589 -
編程語言
+關注
關注
10文章
1951瀏覽量
35018
原文標題:干貨 | IPv6正則表達式攻略
文章出處:【微信號:ZTEdeveloper,微信公眾號:中興開發者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
什么是正則表達式?正則表達式如何工作?哪些語法規則適用正則表達式?
![什么是<b class='flag-5'>正則表達式</b>?<b class='flag-5'>正則表達式</b>如何工作?哪些語法規則適用<b class='flag-5'>正則表達式</b>?](https://file1.elecfans.com/web2/M00/AE/20/wKgZomVElreATCOkAAAZcufzGxQ593.png)
shell正則表達式學習
深入淺出boost正則表達式
關于java正則表達式的用法詳解
Python正則表達式教程之標準庫的完整介紹及使用示例說明
![Python<b class='flag-5'>正則表達式</b>教程之標準庫的完整介紹及使用示例說明](https://file.elecfans.com/web1/M00/83/76/pIYBAFxII9WAPjxiAARjGveRivw465.png)
Python正則表達式的學習指南
![Python<b class='flag-5'>正則表達式</b>的學習指南](https://file.elecfans.com/web1/M00/C6/FF/pIYBAF9gaBSAXRd6AAEWizeKtYM066.png)
Python正則表達式指南
![Python<b class='flag-5'>正則表達式</b>指南](https://file.elecfans.com/web1/M00/E7/4F/pIYBAGBdNieALCE4AACIo_q8eqU058.jpg)
python正則表達式中的常用函數
Linux入門之正則表達式
![Linux<b class='flag-5'>入門</b>之<b class='flag-5'>正則表達式</b>](https://file1.elecfans.com/web2/M00/82/B6/wKgaomRd6wSANLmuAAF_f2pHzD0726.jpg)
shell腳本基礎:正則表達式grep
![shell腳本基礎:<b class='flag-5'>正則表達式</b>grep](https://file1.elecfans.com/web2/M00/88/C8/wKgaomR0AECASQTRAAAeSP1vqeU331.png)
評論