正則表達式匹配身份證 電話號碼 郵箱 住宅電話 郵編等
身份證號碼的匹配
大陸的居民身份證號碼有兩種:18位和15位,15位的身份證號碼是老一代身份證號碼。
18 位和15位的區別在于兩個部分:第一,18位號碼的年份以4位計而15位號碼的年份為2位,如1987年在18位號碼中為‘1987’而在15位號碼中為 ‘87’,這里1987只是作為一個例子可能1987年及以后根本不存在15位號碼;第二處不同在于18位號碼的最后一位為數字校驗碼,15位號碼沒有數 字校驗位。
好吧,可能你還不知道身份證號碼各個部分代表著什么,那么讓我簡略地介紹一下。
身份證號碼總共有4個部分(15位號碼只有3部分),從左向右分別為:第一部分有6位,為居民在辦理身份證時戶口所在地的地址碼(什么是地址碼?自己到統計局去找吧,地址如下:http://www.stats.gov.cn/tjbz/index.htm); 第二部分有8位(15位號碼為6位),為居民出生日期碼;第三部分有3位,為數字順序碼,也就是同一天出生的人的一個排序,奇數代表男性而偶數代表女性; 第四部分也就是最后一部分有1位,為數字校驗碼,此部分只有18位號碼才有,關于數字校驗碼怎樣計算得出,稍后會詳述。
先 舉個例子吧,假設存在以下身份證號碼:35052519870101888X(15位的話為350525870101888),用‘-’號將各部分區分如 下:350525-19870101-888-X。其中,350525為地址碼,沒錯,到統計局查詢的結果是‘福建省永春縣’——一個桃園勝境,算了,不 廢話;19870101為出生日期碼,呵呵,1987年1月1日這一天出生的人肯定是有滴;888為順序碼,估計1987年1月1日第888個出生的人應 該沒有吧,倘若真的有,那真不是人,是神!!呵呵,估計我黨也不會給神這個號碼,不多說了,再多說可能要人神共怒了……好吧,那么X是什么呢?怎么有些人 的身份證號碼最后一位會突然冒出一個X呢,是這些人比較特殊嗎?答案是:不是的,也算是吧,倘若有一種個位數等于10,這些人也不用在身份證號碼的最后一 位被不明不白地加上一個X了,究竟是怎么一回事且聽我細細道來^_^
18位居民身份證號碼最后一位——數字校驗碼的計算方法:
1. 將身份證號碼的前17位數分別乘以以下系數:7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;
2. 將以上分別相乘得到的結果相加;
3. 將以上相加的結果除以11,得出余數;
4. 以上得出的余數可能為0 - 10這11個數中的某一個數字。10是一個另類,因為我們的數字校驗位只有1位顯然需要一種替換方案,用1位將10換下,于是X派上用場了。注意了,數字校驗位并不就是余數!!所得的11個余數:
0,1,2,3,4,5,6,7,8,9,10 的數字校驗位分別為:
1,0,X,9,8,7,6,5,4,3,2
PS: 通過以上的計算,現在應該非常清楚了,身份證號碼的最后一位為X是因為在作校驗時所得的余數是2,顯然這些號碼也沒什么特別的嗎。需要強調一下的是,X并 不是英文字母哦,而是羅馬數字X,記住,它不是字母而是數字,但是,呵呵,我們一般用英文大寫字母X來表示羅馬數字X,囧nz……
讓我花點時間來校驗以上的身份證號碼:35052519870101888X是否正確吧,先聲明倘若證實可用千萬別拿去做假證,一切本人概不負責!
1.前17位分別乘以相應系數:3*7+5*9+0*10+5*5+2*8+5*4+1*2+9*1+8*6+7*3+0*7+1*9+0*10+1*5+8*8+8*4+8*2=333(假如沒算錯的話^_^)
2.將以上所得結果333除以11,得出余數:3
3.呵呵35052519870101888X這個號碼不是有效的身份證號碼,有效號碼應該為350525198701018889
好了,知道了居民身份證號碼各部分的意思后,我們終于可以動手尋求號碼驗證的解決方案了。
假設我們的系統并不知道輸入號碼之人的任何信息(如果系統還要求輸入籍貫和出生日期,還可以進一步進行檢驗真偽喔^_^)
首 先,地址碼的前2位是省級的編號,到統計局去查詢得知第1位非0,并且目前的范圍為1-9,9是國外的身份證號碼。第2位的范圍為0-7。統計局一般每一 年都會公布一次更新的地址碼,但對比多年來的地址碼可以看出地址碼基本上是不變的(要是變了,現有的身份證號碼豈不是都沒用了^_^)。我們的地址碼的正 則表達式可以這樣寫:/^[1-9][0-7]\d{4}/,其實,這么寫不夠精確,倘若要就目前的地址碼寫出精確的表達式,應該這么寫 /^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71| (8[12])|91)\d{4}/,這樣寫顯然精確多了,但表達式長了很多,當然為求精確表達式長一點是可以接受的,但是假如統計局修改了省級地址碼, 那么該表達式要根據實際情況稍作改動,所幸省級地址碼應該是不會變的,呵呵,所以選擇哪一種表達式都是可以的,我這就不寫那么長的表達式了,所以選擇 /^[1-9][0-7]\d{4}/吧。
接下來就是日期了喔,呵呵,貌似之前寫過的日期匹配可以借鑒來用一下,當時的那個表達式如下:
/^((((19|20)\d{2})-(0?[13-9]|1[012])-(0?[1-9]|[12]\d|30))|(((19|20)\d{2})-(0?[13578]|1[02])-31)|(((19|20)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|((((19|20)([13579][26]|[2468][048]|0[48]))|(2000))-0?2-29))$/
這個表達式可以匹配1900-2099年的日期,還支持閏年。
我 們的表達式不需要匹配那么長的時間,能夠匹配二十世紀的就夠了,什么,不知道二十世紀?1900-1999總該知道吧^_^為什么匹配了這個范圍就夠了 呢?去查一下居民身份證的歷史吧,我敢打保票1900-1999的范圍還太大了。至于二十一世紀的新一代,呵呵,就算他是2000年出生的,目前也就15 歲(有些算法是14歲,囧),這些人的號碼應該還打印在戶口簿里,拿出手也不會產生什么作用,再說,二十一世紀的人也不屑于我目前所寫的匹配^_^
好吧,廢話太多了,開始匹配日期吧。稍微修改了以上表達式:
/((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))/
正則表達式里沒有計算驗證的能力,所以對于順序碼,我們除了基本的匹配外無力于做什么,所以順序碼的表達式為:/\d{3}/
最后一位數字驗證碼——/(\d|X|x)?$/。之所以那么寫是因為,最后一位可能值為數字或X,但有些人可能習慣將X寫成小寫的x,我們必須視為正確,而最后的?是為了與15位號碼兼容,此時只需將15位號碼的年份用4位表示即可用我們以下整合的表達式進行匹配了——
/^[1-9][0-7]\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/
地址碼精確一點的表達式:
/^((1[1-5])|(2[1-3])|(3[1-7])|(4[1-6])|(5[0-4])|(6[1-5])|71|(8[12])|91)\d{4}((19\d{2}(0[13-9]|1[012])(0[1-9]|[12]\d|30))|(19\d{2}(0[13578]|1[02])31)|(19\d{2}02(0[1-9]|1\d|2[0-8]))|(19([13579][26]|[2468][048]|0[48])0229))\d{3}(\d|X|x)?$/
區號+座機號碼+分機號碼:regexp="^(0[0-9]{2,3}/-)?([2-9][0-9]{6,7})+(/-[0-9]{1,4})?$"
手機(中國移動手機號碼):regexp="^((/(/d{3}/))|(/d{3}/-))?13[456789]/d{8}|15[89]/d{8}"
所有手機號碼:regexp="^((/(/d{3}/))|(/d{3}/-))?13[0-9]/d{8}|15[89]/d{8}"(新添加了158,159兩個號段)
((/d{11})|^((/d{7,8})|(/d{4}|/d{3})-(/d{7,8})|(/d{4}|/d{3})-(/d{7,8})-(/d{4}|/d{3}|/d{2}|/d{1})|(/d{7,8})-(/d{4}|/d{3}|/d{2}|/d{1}))$)
匹配格式:
11位手機號碼
3-4位區號,7-8位直播號碼,1-4位分機號
如:12345678901、1234-12345678-1234
1.用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^/uFF00-/uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/uFF00-/uFFFF]/g,''))"
2. 用正則表達式限制只能輸入數字:onkeyup="value=value.replace(/[^/d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"
3. 用正則表達式限制只能輸入數字和英文:onkeyup="value=value.replace(/[/W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^/d]/g,''))"
4.計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
String.prototype.len=function(){return this.replace([^/x00-/xff]/g,"aa").length;}
5.javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:
String.prototype.trim = function()
{
return this.replace(/(^/s*)|(/s*$)/g, "");
}
利用正則表達式分解和轉換IP地址:
6.下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的Javascript程序:
function IP2V(ip)
{
re=/(/d+)/.(/d+)/.(/d+)/.(/d+)/g //匹配IP地址的正則表達式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("不是一個正確的IP地址!")
}
}
不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:
var ip="10.100.20.168"
ip=ip.split(".")
alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
正則表達式用于字符串處理、表單驗證等場合,實用高效。現將一些常用的表達式收集于此,以備不時之需。
匹配中文字符的正則表達式: [/u4e00-/u9fa5]
評注:匹配中文還真是個頭疼的事,有了這個表達式就好辦了
匹配雙字節字符(包括漢字在內):[^/x00-/xff]
評注:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
匹配空白行的正則表達式:/n/s*/r
評注:可以用來刪除空白行
匹配HTML標記的正則表達式:<(/S*?)[^>]*>.*?<//1>|<.*? />
評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復雜的嵌套標記依舊無能為力
匹配首尾空白字符的正則表達式:^/s*|/s*$
評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式
匹配Email地址的正則表達式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
評注:表單驗證時很實用
匹配網址URL的正則表達式:[a-zA-z]+://[^/s]*
評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求
匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
評注:表單驗證時很實用
匹配國內電話號碼:/d{3}-/d{8}|/d{4}-/d{7}
評注:匹配形式如 0511-4405222 或 021-87888822
匹配騰訊QQ號:[1-9][0-9]{4,}
評注:騰訊QQ號從10000開始
匹配中國郵政編碼:[1-9]/d{5}(?!/d)
評注:中國郵政編碼為6位數字
匹配身份證:/d{15}|/d{18}
評注:中國的身份證為15位或18位
匹配ip地址:/d+/./d+/./d+/./d+
評注:提取ip地址時有用
匹配特定數字:
^[1-9]/d*$ //匹配正整數
^-[1-9]/d*$ //匹配負整數
^-?[1-9]/d*$ //匹配整數
^[1-9]/d*|0$ //匹配非負整數(正整數 + 0)
^-[1-9]/d*|0$ //匹配非正整數(負整數 + 0)
^[1-9]/d*/./d*|0/./d*[1-9]/d*$ //匹配正浮點數
^-([1-9]/d*/./d*|0/./d*[1-9]/d*)$ //匹配負浮點數
^-?([1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0)$ //匹配浮點數
^[1-9]/d*/./d*|0/./d*[1-9]/d*|0?/.0+|0$ //匹配非負浮點數(正浮點數 + 0)
^(-([1-9]/d*/./d*|0/./d*[1-9]/d*))|0?/.0+|0$ //匹配非正浮點數(負浮點數 + 0)
評注:處理大量數據時有用,具體應用時注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
^/w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串
評注:最基本也是最常用的一些表達式
匹配中文字符的正則表達式: [/u4e00-/u9fa5]
匹配雙字節字符(包括漢字在內):[^/x00-/xff]
匹配空行的正則表達式:/n[/s| ]*/r
匹配HTML標記的正則表達式:/<(.*)>.*<///1>|<(.*) //>/
匹配首尾空格的正則表達式:(^/s*)|(/s*$)
匹配Email地址的正則表達式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
匹配網址URL的正則表達式:http://([/w-]+/.)+[/w-]+(/[/w- ./?%&=]*)?
^/d+$ //匹配非負整數(正整數 + 0)
^[0-9]*[1-9][0-9]*$ //匹配正整數
^((-/d+)|(0+))$ //匹配非正整數(負整數 + 0)
^-[0-9]*[1-9][0-9]*$ //匹配負整數
^-?/d+$ //匹配整數
^/d+(/./d+)?$ //匹配非負浮點數(正浮點數 + 0)
^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$ //匹配正浮點數
^((-/d+(/./d+)?)|(0+(/.0+)?))$ //匹配非正浮點數(負浮點數 + 0)
^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$ //匹配負浮點數
^(-?/d+)(/./d+)?$ //匹配浮點數
^[A-Za-z]+$ //匹配由26個英文字母組成的字符串
^[A-Z]+$ //匹配由26個英文字母的大寫組成的字符串
^[a-z]+$ //匹配由26個英文字母的小寫組成的字符串
^[A-Za-z0-9]+$ //匹配由數字和26個英文字母組成的字符串
^/w+$ //匹配由數字、26個英文字母或者下劃線組成的字符串
^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$
"^/d+$" //非負整數(正整數 + 0)
"^[0-9]*[1-9][0-9]*$" //正整數
"^((-/d+)|(0+))$" //非正整數(負整數 + 0)
"^-[0-9]*[1-9][0-9]*$" //負整數
"^-?/d+$" //整數
"^/d+(/./d+)?$" //非負浮點數(正浮點數 + 0)
"^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮點數
"^((-/d+(/./d+)?)|(0+(/.0+)?))$" //非正浮點數(負浮點數 + 0)
"^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$" //負浮點
數
"^(-?/d+)(/./d+)?$" //浮點數
"^[A-Za-z]+$" //由26個英文字母組成的字符串
"^[A-Z]+$" //由26個英文字母的大寫組成的字符串
"^[a-z]+$" //由26個英文字母的小寫組成的字符串
"^[A-Za-z0-9]+$" //由數字和26個英文字母組成的字符串
"^/w+$" //由數字、26個英文字母或者下劃線組成的字符串
"^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$" //email地址
"^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$" //url
/^13/d{9}$/gi手機號正則表達式
public static bool IsValidMobileNo(string MobileNo)
{
const string regPattern = @"^(130|131|132|133|134|135|136|137|138|139)/d{8}$";
return Regex.IsMatch(MobileNo, regPattern);
}
正則表達式--驗證手機號碼:13[0-9]{9}
實現手機號前帶86或是+86的情況:^((/+86)|(86))?(13)/d{9}$
電話號碼與手機號碼同時驗證:(^(/d{3,4}-)?/d{7,8})$|(13[0-9]{9})
提取信息中的網絡鏈接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(/w|//|//|/.)+('|"| *|>)?
提取信息中的郵件地址:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
提取信息中的圖片鏈接:(s|S)(r|R)(c|C) *= *('|")?(/w|//|//|/.)+('|"| *|>)?
提取信息中的IP地址:(/d+)/.(/d+)/.(/d+)/.(/d+)
提取信息中的中國手機號碼:(86)*0*13/d{9}
提取信息中的中國固定電話號碼:(/(/d{3,4}/)|/d{3,4}-|/s)?/d{8}
提取信息中的中國電話號碼(包括移動和固定電話):(/(/d{3,4}/)|/d{3,4}-|/s)?/d{7,14}
提取信息中的中國郵政編碼:[1-9]{1}(/d+){5}
提取信息中的中國身份證號碼:/d{18}|/d{15}
提取信息中的整數:/d+
提取信息中的浮點數(即小數):(-?/d*)/.?/d+
提取信息中的任何數字 :(-?/d*)(/./d+)?
提取信息中的中文字符串:[/u4e00-/u9fa5]*
提取信息中的雙字節字符串 (漢字):[^/x00-/xff]*