IP地址(IPv4)/IPv6地址的正規表示式

sinodzh發表於2013-12-04

原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/

Pv4地址
正規表示式:^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
測試環境:Javascript/.Net/C++/JAVA
特點:匹配IPv4地址

IPv6地址
正規表示式:^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$
測試環境:Javascript/.Net/C++/JAVA
特點:支援IPv6的基本格式

IPv6地址
正規表示式:^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$|^:((:[\da-fA-F]{1,4}){1,6}|:)$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?$|^([\da-fA-F]{1,4}:){6}:$
測試環境:Javascript/.Net/C++/JAVA
特點:支援壓縮

IPv6地址
正規表示式:^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$
測試環境:Javascript/.Net/C++/JAVA
特點:只支援IPv6/IPv4混合地址。前面IPv6部分支援壓縮

IPv6地址
正規表示式:^([\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^::([\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:):([\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){2}:([\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){3}:([\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$|^([\da-fA-F]{1,4}:){7}[\da-fA-F]{1,4}$|^:((:[\da-fA-F]{1,4}){1,6}|:)$|^[\da-fA-F]{1,4}:((:[\da-fA-F]{1,4}){1,5}|:)$|^([\da-fA-F]{1,4}:){2}((:[\da-fA-F]{1,4}){1,4}|:)$|^([\da-fA-F]{1,4}:){3}((:[\da-fA-F]{1,4}){1,3}|:)$|^([\da-fA-F]{1,4}:){4}((:[\da-fA-F]{1,4}){1,2}|:)$|^([\da-fA-F]{1,4}:){5}:([\da-fA-F]{1,4})?$|^([\da-fA-F]{1,4}:){6}:$
測試環境:Javascript/.Net/C++/JAVA
特點:支援所有格式的IPv6地址



分析:
       IPv4:通常用點分十進位制表示IP地址。IP地址長4個位元組共32位,點分十進位制將其分為4部分,中間用“.”號分開,所以每部分共8位,二進位制為“00000000”到“11111111”,十進位制為“0”到“255”。
       IPv6:由128位(8*16),分8段,每段16位,段與段之間用“:”分開,用十六進位制表示,格式FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF,IPv6地址可以壓縮。

IPv4匹配:
0.0.0.0
255.255.255.255
192.168.1.1
0.0.0.1
01.1.1.1
5.025.25.25

IPv4不匹配:
111.111.111.256

IPv6匹配:
5e:0:0:0:0:0:5668:eeee
5e:0:0:023:0:0:5668:eeee
5e::5668:eeee
::1:8:8888:0:0:8
1::
::1:2:2:2
::

IPv6不匹配:
5e::5668::eeee
55555:5e:0:0:0:0:0:5668:eeee

IPv6/IPv4混合地址匹配:
11:11:e:1EEE:11:11:200.200.200.200
e:ee:5:e::0.0.0.254
::EfE:120.0.0.1
::120.0.0.1
ee:ee::11.11.11.125

------------------------------------------------------------------------
                       小數的正規表示式
------------------------------------------------------------------------

小數
正規表示式:^([-+]?[1-9]\d*\.\d+|-?0\.\d*[1-9]\d*)$
測試環境:.NET/Javascript

分析:
       不考濾科學計數法。

匹配:
0.012
0.000000005
-0.000000005
1.00001
-1.000000010
24.215
+2.25
1.0
       
不匹配:
0.0
0000.02
001.001
1.1.1

------------------------------------------------------------------------
                       E-mail地址的正規表示式
------------------------------------------------------------------------

E-mail地址
正規表示式:^[a-zA-Z0-9]((?測試環境:.NET/C++
特點:域名部分可以為IP地址,不考濾域名部分為主機名的情況,域名部分不能保證總長度在256字元以內。

分析:
       E-mail地址分三部分:
       第一部分:使用者帳號。
       第二部分:“@”符號(英文單詞“at”的符號化)。
       第三部分:域名或者IP地址。
       您的郵箱名應該由a-Z、A-Z、0-9開頭,郵箱名可由英文字母、0~9的數字、點、減號或下劃線組成;郵箱名長度為3~18個字元;郵箱名不能以點、減號或下劃線結尾,不能出現連續兩個或兩個以上的點、減號。

匹配:
321635@qq.com
3565352@10.0.0.1
dslfklds3546_.-dl@dlsk.com
lsdkf__dlskflk@ds.com

不匹配:
adfd@hostname
sdfsdlk..ldsfil@ds.com
aa@d.com
-dfddsf@ad.com

------------------------------------------------------------------------
                       手機號碼的正規表示式
------------------------------------------------------------------------
手機
正規表示式:^((\+86)?|\(\+86\))0?1[358]\d{9}$
測試環境:.Net

分析:
       手機號碼長度11位,以 1 開頭,第二位是 3、5 或者 8 (好像有了189開頭的號碼了)。

匹配:
13111111111
015111111111
+8613111111111
+8615111111111
+86015111111111
(+86)13111111111
不匹配:
11111111111
131111111
151111111111

------------------------------------------------------------------------
                       域名的正規表示式
------------------------------------------------------------------------
正規表示式:^([0-9a-zA-Z][0-9a-zA-Z-]{0,62}\.)+([0-9a-zA-Z][0-9a-zA-Z-]{0,62})\.?$
測試環境:.NET/Javascript/C++
特點:無法保證全長在256字元以內。

分析:
       一個完整的域名,由根域、頂級域、二級、三級……域名構成,每級域名之間用點分開,每級域名由字母、數字和減號構成(第一個字母不能是減號),不區分大小寫,單個域長度不超過63,完整的域名全長不超過256個字元。在DNS系統中,全名是以一個點“.”來結束的,例如“www.nit.edu.cn.”。沒有最後的那個點則表示一個相對地址。

匹配:
www.baidu.com
sd-.2222222.22222222222.222222222222222.22222222.222222222.dfsd.cslkd

不匹配:
sdlkk.ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd.cn

------------------------------------------------------------------------
                       固定電話的正規表示式
------------------------------------------------------------------------
區號:^0?([1-9]\d|[3-9][13579]\d|[3-9][24680]\d{2})$

國家程式碼:+86
正規表示式:\+86

區號-市話號碼                        如:10-11111111,010-11111111
正規表示式:^0?([1-9]\d-\d{6,8}|[3-9][13579]\d-\d{6,7}|[3-9][24680]\d{2}-\d{6})$

區號-市話號碼-分機                          如:10-11111111-111,010-11111111-111
正規表示式:^0?([1-9]\d-\d{6,8}|[3-9][13579]\d-\d{6,7}|[3-9][24680]\d{2}-\d{6})(-\d{3})$

區號<這裡是相連的>市話                如:1011111111,01011111111
正規表示式:^0?([1-9]\d\d{6,8}|[3-9][13579]\d\d{6,7}|[3-9][24680]\d{2}\d{6})$

所有格式:^((\+86)?|\(\+86\)|\+86\s)0?([1-9]\d-?\d{6,8}|[3-9][13579]\d-?\d{6,7}|[3-9][24680]\d{2}-?\d{6})(-\d{3})?$

分析:
       手機號碼:11位,以 1 開頭,第二位是 3 或者 5。沒考濾伺服器的號碼。
       固定電話:總長10位,區號=10-4位,市話長度=10-N,可能還有3位分機號。開頭的“0”不是區號部分,而是供長途直拔電話業務使用的字頭。
       手機: 國家程式碼+手機號
       電話:國家程式碼+區號+電話號碼

  原郵電部對此有如下規定:(1)北京、天津等區號兩位的城市市話號碼長度不大於8位,因為市 話號碼首位不能為1、0,最終容量可達八千萬部。(2)各省會城市和大城市的區號三位,第一位選取“3、4、5、6、7、8、9”共七個數字,第二位選取單數“1、3、5、7、9”共五個數字,第三位隨意。(3)各縣城及小城市的區號四位,第一位選取“3、4、5、6、7、8、9”共七個數字,第二位選取雙數“2、4、6、8、0”共五個數字,第三、四位隨意。

匹配:
1334567890
031-3145678-123
010-11111111
(+86)010-13901691-123

不匹配:
+861678901
(+89)07912140337

------------------------------------------------------------------------
                               日期的正規表示式
------------------------------------------------------------------------

分析:
       中國式日期為“年-月-日”
       年:1到任意在於1的整數,不能“0”開頭。
       月:1到12。
       日:1、3、5、7、8、10、12月有31天;4、6、9、11月有30天,閏年2月份有29天,否則28天。
       閏年的條件是符合下面二者之一:
               (1)能被4整除,但不能被100整除。
               (2)能被4整除,又能被400整除。//縮寫為能被400整除。
       #00格式(#代表任何數),只要#能被4整除,#00就一定能被400整除(閏年)。
       非#00格式(也就不能被100整除了),能被4整除。
第一年的2月份都有28天,只要是閏年還要加一天。現在的任務是找出閏年。
100以內能被4整除的有:
00 04 08 12 16
20 24 28 32 36
40 44 48 52 56
60 64 68 72 76
80 84 88 92 96
他們的表示式為:(0?[048]|[2468][048]|[13579][26])

#00一定會被4整除,所以,只要#能被4整除,#00就一定能被400整除,他就是閏年。
#00格式閏年:(\d*(0?[048]|[2468][048]|[13579][26])00)
因為不能為#00格式,所以要從上面的表中刪除00這個結果。
非#00格式閏年:(\d*(0?[48]|[2468][048]|[13579][26]))
把上面兩個正規表示式合併
閏年:(\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))

整數01-28:(2[0-8]|[01]\d)
整數01-30:(30|[012]\d)
整數01-31:(3[01]|[012]\d)

整數1-28:(2[0-8]|1\d|[1-9])
整數1-30:(30|[12]\d|[1-9])
整數1-31:(3[01]|[12]\d|[1-9])
把上面兩組格式合併在一起:
整數1-28:(2[0-8]|1\d|0?[1-9])
整數1-30:(30|[12]\d|0?[1-9])
整數1-31:(3[01]|[12]\d|0?[1-9])

現在我們把它們全部組合成中國“年-月-日”格式
^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))-0?2-29)$|^[1-9]\d*-((0?[13578]|10|12)-(3[01]|[12]\d|0?[1-9])|(0?[469]|11)-(30|[12]\d|0?[1-9])|(0?2)-(2[0-8]|1\d|0?[1-9]))$

匹配:
1-1-1
244-02-29
10-10-10
2000-2-29
2008-2-29
不匹配:
2009-2-29
2009-13-10
1005-12-65

中國“年/月/日”格式
^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\/0?2\/29)$|^[1-9]\d*\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\/(30|[12]\d|0?[1-9])|(0?2)\/(2[0-8]|1\d|0?[1-9]))$
匹配:
1/1/1
244/02/29
10/10/10
2000/2/29
2008/2/23
不匹配:
2009/2/29
2009/13/10
1005/12/65


中國“年.月.日”格式
^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\.0?2\.29)$|^[1-9]\d*\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\.(30|[12]\d|0?[1-9])|(0?2)\.(2[0-8]|1\d|0?[1-9]))$
匹配:
1.1.1
244.02.29
10.10.10
2000.2.29
2008.2.23
不匹配:
2009.2.29
2009.13.10
1005/12/65

中國“年/月/日”、“年-月-日”、“年.月.日”格式
(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))-0?2-29)$|^[1-9]\d*-((0?[13578]|10|12)-(3[01]|[12]\d|0?[1-9])|(0?[469]|11)-(30|[12]\d|0?[1-9])|(0?2)-(2[0-8]|1\d|0?[1-9]))$)|(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\/0?2\/29)$|^[1-9]\d*\/((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\/(30|[12]\d|0?[1-9])|(0?2)\/(2[0-8]|1\d|0?[1-9]))$)|(^((\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26]))\.0?2\.29)$|^[1-9]\d*\.((0?[13578]|10|12)\.(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\.(30|[12]\d|0?[1-9])|(0?2)\.(2[0-8]|1\d|0?[1-9]))$)
匹配:
1/1/1
244/02/29
10/10/10
2000/2/29
2008/2/29
244-02-29
10-10-10
2000-2-28
2008.2.29
不匹配:
1-1/1
2009/2/29
2009/13/10
1005/12/65
2009-2-29
2009-13-10
1005-12-65

中國“年月日”格式(用於身份證編碼等),年由4位數表示,月2位,日2位
^(((0[048]|[2468][048]|[13579][26])00|\d\d(0[48]|[2468][048]|[13579][26]))0229)$|^\d{4}((0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|02(2[0-8]|1\d|0[1-9]))$
匹配:
19880329
20001220
20080229
不匹配:
1988329
20090229
20091310
10051265

歐美“月/日/年”格式
^(0?2\/29\/(\d*(0?[048]|[2468][048]|[13579][26])00|\d*(0?[48]|[2468][048]|[13579][26])))$|^((0?[13578]|10|12)\/(3[01]|[12]\d|0?[1-9])|(0?[469]|11)\/(30|[12]\d|0?[1-9])|(0?2)\/(2[0-8]|1\d|0?[1-9]))\/[1-9]\d*$
匹配:
1/1/1
02/29/244
10/10/10
02/29/2000
2/29/2008
不匹配:
2/29/2009
13/10/2009
12/65/1005

------------------------------------------------------------------------
                               時間的正規表示式
------------------------------------------------------------------------

時間
正規表示式:
^([01]?\d|2[123]):([0-4]?\d|5\d)(:([0-4]?\d|5\d)(\.\d+|-?0\.\d*[1-9]\d*)? )?(am|AM|pm|PM)?$
缺點:

分析:
       時間格式:HH:mm:ss [am|pm|AM|PM]
                              HH:mm [am|pm|AM|PM]
       HH在0-23之間,mm在0-59之間,ss是大於等於0小於60的小數或整數。
匹配:
1:1:1 am
23:59:59.999
21:58
不匹配:
24:20:20



------------------------------------------------------------------------
                               身份證號碼的正規表示式
------------------------------------------------------------------------
國內的身份證號碼
正規表示式:(^\d{6}((0[48]|[2468][048]|[13579][26])0229|\d\d(0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|(02)(2[0-8]|1\d|0[1-9]))\d{3}$)|(^\d{6}((2000|(19|21)(0[48]|[2468][048]|[13579][26]))0229|(((20|19)\d\d)|2100)(0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|(02)(2[0-8]|1\d|0[1-9]))\d{3}[\dX]$)

一代身份證號碼:^\d{6}((0[48]|[2468][048]|[13579][26])0229|\d\d(0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|(02)(2[0-8]|1\d|0[1-9]))\d{3}$
二代身份證號碼:^\d{6}((2000|(19|21)(0[48]|[2468][048]|[13579][26]))0229|(((20|19)\d\d)|2100)(0[13578]|10|12)(3[01]|[12]\d|0[1-9])|(0[469]|11)(30|[12]\d|0[1-9])|(02)(2[0-8]|1\d|0[1-9]))\d{3}[\dX]$

測試環境:C++/.NET/JAVA/Javascript
屬性:多行模式,大小寫敏感
特點:不能驗證二代身份證校驗碼位的正確性。

分析:

一代15位身份證號碼:六位數字地址碼,第7、8位為出生年份(兩位數),第9、10位為出生月份,第11、12位代表出生日期,第15位代表性別,奇數為男,偶數為女。
二代18位身份證號碼:六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。 
       生日期碼(身份證第七位到第十四位)表示編碼物件出生的年、月、日,其中年份用四位數字表示,年、月、日之間不用分隔符。例如:1981年05月11日就用19810511表示。
       順序碼(身份證第十五位到十七位)為同一地址碼所標識的區域範圍內,對同年、月、日出生的人員編定的順序號。其中第十七位奇數分給男性,偶數分給女性。 
       校驗碼(身份證最後一位)是根據前面十七位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼。 

1984年8月30日我國頒發了第一批身份證(一代身份證),可由此
假設1.持有身份證的人中最老的在1900年出生。
假設2.一代身份證持有人在1900-2010年間出生。
假設3.二代身份證持有人在1900-2100年間出生。

1900-2100年間
閏年:(2000|(19|21)(0[48]|[2468][048]|[13579][26]))
平年:(19|21)(0?[1235679]|[2468][1235679]|[13579][01345789])

匹配:
34052419800229001X
340524800229001
340524199001010013
不匹配:
34052419800101001a
21552418801010011
340524850229001
34052422800110081X
34052419800229001x

相關文章