這篇博文將介紹一些常用的數(shù)字驗(yàn)證方法,包括整數(shù)驗(yàn)證、國(guó)內(nèi)電話號(hào)碼驗(yàn)證、身份證號(hào)碼驗(yàn)證、以及IP地址驗(yàn)證等等驗(yàn)證方法,如果大家對(duì)基本概念不夠了解,可以先看看我之前寫的博文。
第一部分:數(shù)值驗(yàn)證
1.驗(yàn)證只包含數(shù)字、指定長(zhǎng)度(N)的字符串
比如我要驗(yàn)證只包含數(shù)字,長(zhǎng)度為6的字符串,如123456,則可以使用下面幾種效果相同的驗(yàn)證方式
復(fù)制代碼 代碼如下:
\d{6}
[0-9]{6}
\d\d\d\d\d\d
上述幾種方式效果相同,更推薦第一種,它更加簡(jiǎn)潔! 注:后面我都會(huì)使用較為簡(jiǎn)潔的正則表達(dá)式,而不會(huì)太過啰嗦!
2.驗(yàn)證只包含數(shù)字、指定范圍長(zhǎng)度(N-M)的單詞字符串
比如我要驗(yàn)證只包含數(shù)字,長(zhǎng)度在5到8之間的字符串,如12345,123456,1234567,12345678,則可以使用的驗(yàn)證方式
3.非負(fù)整數(shù)的驗(yàn)證
顯然0,100,56等都是非負(fù)整數(shù),而-12,0135等都不是非負(fù)整數(shù),驗(yàn)證演示如下:
我們可以看到021 -56由于不是正數(shù),不會(huì)被選中。(注意:其中用到了^,表示必須以0或者[1-9]開頭,因此-56沒有被選中;如果沒有^,那么-56中的56會(huì)被選中)
4.任意整數(shù)的驗(yàn)證
任意整數(shù)即如0,456,-65等等這是任意整數(shù),也就是說我們需要把正數(shù)和非負(fù)整數(shù)結(jié)合起來(lái),驗(yàn)證演示如下:
于是所有的正數(shù)包括0、正整數(shù)和負(fù)整數(shù)都匹配了。
5.指定范圍內(nèi)的正整數(shù)的驗(yàn)證
比如說我們希望驗(yàn)證1-5678區(qū)間內(nèi)的正整數(shù),如465,23,5677等都屬于這個(gè)范圍,這該怎么驗(yàn)證呢?別著急,我們可以分區(qū)間驗(yàn)證:
- 使用\b[1-9]\d{0-2}\b來(lái)驗(yàn)證1-999之間的所有正整數(shù)
- 使用\b[1-4]\d{3}\b來(lái)驗(yàn)證1000-4999之間的所有正整數(shù)
- 使用\b5[0-5]\d{2}\b來(lái)驗(yàn)證5000-5599之間的所有正整數(shù)
- 使用\b56[0-6]\d\b來(lái)驗(yàn)證5600-5669之間的所有正整數(shù)
- 使用\b567[0-8]\b來(lái)驗(yàn)證5670-5678之間的所有正整數(shù)
綜上所述,我們可以使用如下正則表達(dá)式來(lái)驗(yàn)證1-5678之間的所有正整數(shù):
復(fù)制代碼 代碼如下:
^([1-9]\d{0,2})|([1-4]\d{3})|(5[0-5]\d{2})|(56[0-6]\d)|(567[0-8])$
但果真是這樣嗎?驗(yàn)證如下:
怎么成這樣了呢???后面的三個(gè)數(shù)的驗(yàn)證都不是我們想要的效果?。?!這是因?yàn)檎齽t表達(dá)式在匹配時(shí)會(huì)從左向右匹配,其中2602和4999因?yàn)槭褂肹1-9]\d{0,2}可以完成匹配,所以就無(wú)需繼續(xù)了。
我們把正則表達(dá)式的順序倒過來(lái)試試? 如下所示:
復(fù)制代碼 代碼如下:
^(567[0-8])|(56[0-6]\d)|(5[0-5]\d{2})|([1-4]\d{3})|([1-9]\d{0,2})$
效果如下:
這次令我們高興的是在1-5678之間的數(shù)都被選上了?。〉?89和-5中的5被選上了。這是因?yàn)槲覀冎辉诘谝粋€(gè)分組前添加了^,我們需要做的是每個(gè)分組前都添加^。如下所示:
復(fù)制代碼 代碼如下:
^(567[0-8])|^(56[0-6]\d)|^(5[0-5]\d{2})|^([1-4]\d{3})|^([1-9]\d{0,2})$
這次效果就沒有問題了,如下:
由此可知:組合順序原則(正整數(shù)):依次從最大值的范圍組合到最小值的范圍組合。
從這個(gè)例子受到啟發(fā),我們對(duì)于指定范圍內(nèi)的正整數(shù)的驗(yàn)證的第一個(gè)例子中的每一個(gè)分組后添加$或\b也可以解決問題。
也就是說下面的兩行代碼均有效:
復(fù)制代碼 代碼如下:
^(567[0-8])|^(56[0-6]\d)|^(5[0-5]\d{2})|^([1-4]\d{3})|^([1-9]\d{0,2})$
^([1-9]\d{0,2})$|([1-4]\d{3})$|(5[0-5]\d{2})$|(56[0-6]\d)$|(567[0-8])$
6.實(shí)數(shù)的驗(yàn)證
這里要介紹的實(shí)數(shù)的驗(yàn)證是至少包含一個(gè)小數(shù)點(diǎn)的實(shí)數(shù),因此實(shí)數(shù)就包括了整數(shù)部分、小數(shù)部分和小數(shù)點(diǎn)。
驗(yàn)證方法如下:
復(fù)制代碼 代碼如下:
-?(0|([1-9]\d*))\.\d+
其中-?表示可以有負(fù)號(hào)也可以沒有負(fù)號(hào),(0|[1-9]\d*)表示整數(shù)部分可以是0也可以是不以0開頭的其他整數(shù),\.是為了對(duì)元字符.進(jìn)行轉(zhuǎn)義,\d+表示在小數(shù)點(diǎn)后面可以有1個(gè)或多個(gè)數(shù)字重復(fù)。所以它可以用來(lái)驗(yàn)證一般形式的實(shí)數(shù)(如0.0、1.2、-1.20等),還可以用來(lái)驗(yàn)證負(fù)0,如-0.0、-0.00等。
如果我們希望驗(yàn)證指定精度的實(shí)數(shù),我們只需要把末尾的+修改成相應(yīng)的精度即可,如下所示:
復(fù)制代碼 代碼如下:
-?(0|([1-9]\d*))\.\d{3}$
即表示小數(shù)部分長(zhǎng)度為3的實(shí)數(shù)。
7.科學(xué)計(jì)數(shù)法的驗(yàn)證
科學(xué)計(jì)數(shù)法就是把一個(gè)數(shù)記成a*10^n的形式。其中,a是一位整數(shù)或著是只有一位整數(shù)的小數(shù)(如5,3.2等等),所以可知1=|a|10。而n是一位整數(shù)。所以不難得出科學(xué)計(jì)數(shù)法的驗(yàn)證方法如下所示:
復(fù)制代碼 代碼如下:
^-?[1-9](\.\d+)?\*10\^-?\d+$
第二部分:4種國(guó)內(nèi)電話號(hào)碼的驗(yàn)證
我們知道中國(guó)的電話號(hào)碼的形式不外乎有下面四種:
1.手機(jī)號(hào)碼
2.固定電話號(hào)碼(不包括區(qū)號(hào))
3.區(qū)號(hào)+固定電話號(hào)碼
4.區(qū)號(hào)+固定電話號(hào)碼+分機(jī)號(hào)
下面我們按照順序逐一介紹
1.手機(jī)號(hào)碼
目前國(guó)內(nèi)的手機(jī)號(hào)碼多是13開頭、15開頭和18開頭,并且第三位數(shù)字目前都有【0-9】這10個(gè)數(shù),所以驗(yàn)證起來(lái)就很簡(jiǎn)單了。如下所示:
顯然第二種方法更簡(jiǎn)單一些。
2.固定電話號(hào)碼(不包括區(qū)號(hào))
固定電話號(hào)碼一般為7位(如2268358)或8位(82668110),所以驗(yàn)證起來(lái)是非常簡(jiǎn)單的,如下所示:
但是,某個(gè)地區(qū)的電話號(hào)碼往往是固定在一個(gè)具體的范圍里的,比如新疆石河子某個(gè)地區(qū)為2268001-2268999,這時(shí)想要確定就需要稍微花一些功夫了。
我們可以把2268001-2268999劃分為2268001-2268009和2268010-2268099和2268100-2268999。這樣,把驗(yàn)證三者的正則表達(dá)式組合起來(lái)即可。如下所示:
復(fù)制代碼 代碼如下:
2268((00[1-9])|(0[1-9]\d)|([1-9]\d{2}))
效果如下:
PS 這里就不具體介紹啦,都是很簡(jiǎn)單的知識(shí),如果有疑問可以看我的上一篇博文,它對(duì)基本知識(shí)闡述得很具體。
3.區(qū)號(hào)+固定電話號(hào)碼驗(yàn)證
區(qū)號(hào)的長(zhǎng)度一般為3-4位,固定電話號(hào)碼的長(zhǎng)度一般為7-8位,比如029-82668110為3位區(qū)號(hào)和8位固定電話號(hào)碼的組合,0993-2268358是4位區(qū)號(hào)和7位固定號(hào)碼的組合。且在區(qū)號(hào)和固定號(hào)碼之間一般都是由-(連字符)鏈接的??芍覀冎恍枰獙?duì)區(qū)號(hào)和固定電話分別驗(yàn)證即可?! ?/p>
復(fù)制代碼 代碼如下:
\b0\d{2,3}[- ]?\d{7,8}\b
演示效果如下:
4.區(qū)號(hào)+固定電話號(hào)碼驗(yàn)證+分機(jī)號(hào)碼驗(yàn)證
一些比較大的公司、企業(yè)或者政府部門在向外部提供固定的電話號(hào)碼是,除了區(qū)號(hào)、固定電話號(hào)碼之外,還可能包括分機(jī)號(hào)碼。
下面我們以4位的分級(jí)號(hào)碼為例。一般在分機(jī)號(hào)碼之前可能是空格,也可能是-(連字符),還可能什么都沒有。 于是驗(yàn)證方法如下:
復(fù)制代碼 代碼如下:
\b0\d{2,3}[- ]?\d{7,8}[- ]?\d{4}\b
演示效果如下:
第三部分:2種身份證號(hào)碼的驗(yàn)證
1.基本知識(shí)
15位身份證號(hào)碼:
1985年我國(guó)實(shí)行居民身份證制度,當(dāng)時(shí)簽發(fā)的身份證號(hào)碼是15位的。其中前6位為地址碼,中間6位為出生日期碼(年月日各用兩位數(shù)字表示),最后三位為順序碼。
(注:順序碼是對(duì)同年、同月、同日出生的人編訂序號(hào),順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性)
18位身份證號(hào)碼:
1999年我國(guó)開始使用18位的身份證號(hào)。其中前6位為地址碼,中間8位為出生日期碼(年用4位表示,月日各用2位表示),最后四位為順序碼和校驗(yàn)碼。
(注:年份用4位是因?yàn)槭褂?位會(huì)導(dǎo)致沖突,比如1903年和2003年出生的人。而校驗(yàn)碼主要是為了校驗(yàn)計(jì)算機(jī)輸入公民身份證號(hào)碼的前17位數(shù)字是否正確,其取值范圍是0至10,當(dāng)值等于10時(shí),用X表示)
2. 15位身份證號(hào)碼的驗(yàn)證
前6位地址碼可以為任意數(shù)字,78位的年份碼為任意數(shù)字,9和10位的月份碼應(yīng)當(dāng)在01-12之間,11和12位的日期碼在01-31之間,最后三位的順序碼為長(zhǎng)度為3的任意字符串。于是驗(yàn)證方法如下:
復(fù)制代碼 代碼如下:
\b\d{8}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}\b
3. 18位身份證號(hào)碼的驗(yàn)證
前6位地址碼為任意數(shù)字,7-10位的年份碼前兩位以19或20開頭(這里就不考慮18開頭了),月日同15位的身份證號(hào)碼,三位順序碼為長(zhǎng)度為3的任意字符串,最后以為驗(yàn)證碼為0-9或X。于是驗(yàn)證方法如下:
\b\d{6}(19|20)\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)\b
因?yàn)橹灰懒怂悸?,正則表達(dá)式寫出來(lái)并不難,所以這里就不細(xì)講了。
第四部分:郵政編碼驗(yàn)證
我國(guó)郵政編碼的編碼規(guī)則:我國(guó)采用四級(jí)六位編碼制,前兩位表示省、市、自治區(qū),第三位代表郵區(qū),第四位代表縣、市,最后兩位代表投遞郵局,最后兩位是代表從這個(gè)城市哪個(gè)投遞區(qū)投遞的,即投遞區(qū)的位置。例如:郵政編碼“130021”“13”代表吉林省,“00”代表省會(huì)長(zhǎng)春,“21”代表所在投遞區(qū)。
因此驗(yàn)證我國(guó)的郵政編碼就十分方便了,如下所示:
第五部分:兩種IP地址的驗(yàn)證
IP地址可以簡(jiǎn)單驗(yàn)證,還可以精確驗(yàn)證。
1.簡(jiǎn)單IP地址驗(yàn)證
我首先ping到了https://www.jb51.net/的IP地址:42.121.252.58。 實(shí)際上IP地址一般是1~3位整數(shù).1~3位整數(shù).1~3位整數(shù).1~3位整數(shù),于是我們可以通過下面的正則表達(dá)式作簡(jiǎn)單驗(yàn)證:
([1-9]\d{0,2}\.){3}[1-9]\d{0,2}
驗(yàn)證效果如下所示:
2.精確IP地址驗(yàn)證
顯然,上面的簡(jiǎn)單IP地址驗(yàn)證是不精確的,比如999.999.999.999這就不是一個(gè)正確的IP地址。
我們知道32位IP地址的每一個(gè)數(shù)值都是在0~255之間,所以對(duì)于1~3位整數(shù).1~3位整數(shù).1~3位整數(shù).1~3位整數(shù)我們應(yīng)該將整數(shù)限制在0~255之間,顯然,這里要使用分區(qū)間的方法了。
0-99之間可以這樣表示:([1-9]\d?)|0 (注意這里的表示方法,如果這個(gè)數(shù)不為0,那么前面就不能有0)
100-199之間可以這樣表示:1\d{2}
200-249之間可以這樣表示:2[0-4]\d
250-255之間可以這樣表示: 25[0-5]
于是綜上所述,可以得到精確IP地址驗(yàn)證的方法如下:
復(fù)制代碼 代碼如下:
(((25[0-5])|2[0-4]\d|1\d{2}|[1-9]\d|0)\.){3}((25[0-5])|2[0-4]\d|1\d{2}|[1-9]\d|0)
演示效果如下:
值得注意的是:分組是至關(guān)重要的,只有分對(duì)了組,才有可能不出問題。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- 常見的數(shù)字驗(yàn)證正則表達(dá)式整理
- JS正則表達(dá)式驗(yàn)證數(shù)字代碼
- 最全的常用正則表達(dá)式大全——包括校驗(yàn)數(shù)字、字符、一些特殊的需求等
- java正則表達(dá)式提取數(shù)字的方法實(shí)例
- js限制文本框只能輸入數(shù)字(正則表達(dá)式)
- js正則表達(dá)式匹配數(shù)字字母下劃線等
- JavaScript基于正則表達(dá)式的數(shù)字判斷函數(shù)
- 校驗(yàn)普通電話、傳真號(hào)碼的正則表達(dá)式(可以+開頭,除數(shù)字外,可含有-)
- Java正則表達(dá)式過濾出字母、數(shù)字和中文
- 匹配5到10位無(wú)重復(fù)數(shù)字的正則表達(dá)式
- 利用正則表達(dá)式(只錄入中文,數(shù)字,英文)
- asp正則表達(dá)式匹配數(shù)字$數(shù)字$數(shù)字$