摘要:下面分別分析出生日期和校驗位檢查生日日期是否正確輸入的身份證號里出生日期不對將位身份證轉成位校驗位按照的規定生成,可以認為是數字。
一、創建方式
字面量創建方式
var reg = /abc/;
對象RegExp,適合正則表達式模式不確定的時候
var reg = new RegExp("abc");
常用:
1. w匹配一個單字字符(字母,數字,下劃線) W
2. d匹配一個數字 D
3. x|y匹配x或y
例如,/green|red/匹配“green apple”中的‘green’和“redapple”中的‘red’
4. "*"匹配0次或多次
5. "+"匹配1次或多次
6. "?"匹配0次或1次 與"*" "+" 量詞配合使用時,顯示非貪婪屬性 難點
7. "."匹配除了換行符(n)之外的任何單個字符
8. "x(?=y)"匹配x僅僅當x后面緊跟y的時候 正向肯定查找
var re = /Jack(?= Sprat)/; console.log(re.test("Jack Sprat"));
9. "x(?!y)"匹配"x"僅僅當"x"后面不跟著"y 正向否定查找
console.log(/d+(?!.)/.exec("3.141")); //匹配‘141’但是不是‘3.141’
10. "(x)"匹配x并記住該匹配項(記住有啥作用?) 捕獲 難點
var re = /(foo) (bar) 1 2/; console.log(re.test("foo bar foo bar")); //true console.log("bar foo".replace( /(...) (...)/, "$2 $1" )); //foo bar console.log("bar foo".replace( /(...) (...)/, "$1 $2" )); //bar foo
11. "(?:x)"匹配x但不記住 非捕獲 難點
var re = /foo{1,2}/; console.log(re.test("foo")); //只匹配foo最后的一個o var re = /(?:foo){1,2}/; console.log(re.test("foo")); //匹配foo整個單詞
其他:
{n}n是正整數,匹配正好n次
{n,m}匹配最少n次最多m次,若n m都為0這這個值被忽略
[xyz]匹配方括號中的任意字符 可以用"-"指定一個字符范圍
1匹配任何沒有包含在方括號中的字符
[]匹配一個退格(U+0008)。(不要和混淆了。
匹配詞的邊界 B 反
轉移字符
f
s匹配一個空白字符(包括空格,制表符,換行符) S
v
三、方法exec() 查找匹配的RegExp方法,返回一個數組(未匹配則返回null)
test() 測試是否匹配的RegExp方法,返回true或false
match() 查找匹配的String的方法,返回一個數組(未匹配則返回null)
search() 測試匹配的String方法,返回匹配到的位置索引或在失敗時返回-1
replace() 查找匹配的String方法,并且使用替換字符串替換匹配的字符串
split() 使用正則表達式或者字符串分隔字符串,將分隔后的子字符串存儲到數組中的String方法
自己實際操作一遍
郵箱驗證
/** * * @descrition:判斷輸入的參數是否是個合格標準的郵箱,并不能判斷是否有效,有效只能通過郵箱提供商確定。 * @param:str ->待驗證的參數。 * @return -> true表示合格的郵箱。 * */ var isEmail = function(str){ /** * @descrition:郵箱規則 * 1.郵箱以a-z、A-Z、0-9開頭,最小長度為1. * 2.如果左側部分包含-、_、.則這些特殊符號的前面必須包一位數字或字母。 * 3.@符號是必填項 * 4.右則部分可分為兩部分,第一部分為郵件提供商域名地址,第二部分為域名后綴,現已知的最短為2位。最長的為6為。 * 5.郵件提供商域可以包含特殊字符-、_、. */ var pattern = /^([a-zA-Z0-9]+[-_.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[-_.]?)*[a-zA-Z0-9]+.[a-zA-Z]{2,6}$/; return pattern.test(str); }
密碼長度
/** * * @description: 判斷傳入的參數的長度是否在給定的有效范圍內 * @param: minL->給定的最小的長度 * @param: maxL->給定的最大的長度 * @param: str->待驗證的參數 * @return : true表示合理,驗證通過 * */ var isAvaiableLength = function(minL,maxL,str){ return (str.length >= minL && str.length <= maxL) ? true : false; }
手機
/** * * @descrition:判斷輸入的參數是否是個合格的手機號碼,不能判斷號碼的有效性,有效性可以通過運營商確定。 * @param:str ->待判斷的手機號碼 * @return: true表示合格輸入參數 * */ var isCellphone = function(str) { /** *@descrition:手機號碼段規則 * 13段:130、131、132、133、134、135、136、137、138、139 * 14段:145、147 * 15段:150、151、152、153、155、156、157、158、159 * 17段:170、176、177、178 * 18段:180、181、182、183、184、185、186、187、188、189 * */ var pattern = /^(13[0-9]|14[57]|15[012356789]|17[0678]|18[0-9])d{8}$/; return pattern.test(str); }
身份證
/** * * @descrition: 這個函數對輸入的參數檢查時候是合格的身份證號碼,其身份證有效性無法判斷。檢測的顆粒度可以定制。 * @param->str : 待驗證的參數 * @return : true是合格的身份證 false為不合法的身份證 * */ var checkIdCard = function (num) { num = num.toUpperCase(); var cityCode = {11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "內蒙古", 21: "遼寧", 22: "吉林", 23: "黑龍江 ", 31: "上海", 32: "江蘇", 33: "浙江", 34: "安徽", 35: "福建", 36: "江西", 37: "山東", 41: "河南", 42: "湖北 ", 43: "湖南", 44: "廣東", 45: "廣西", 46: "海南", 50: "重慶", 51: "四川", 52: "貴州", 53: "云南", 54: "西藏 ", 61: "陜西", 62: "甘肅", 63: "青海", 64: "寧夏", 65: "新疆", 71: "臺灣", 81: "香港", 82: "澳門", 91: "國外 "}; if(!cityCode[num.substr(0,2)]){ alert("地址編碼錯誤"); return false; } //身份證號碼為15位或者18位,15位時全為數字,18位前17位為數字,最后一位是校驗位,可能為數字或字符X。 if (!(/(^d{15}$)|(^d{17}([0-9]|X)$)/.test(num))) { //alert("輸入的身份證號長度不對,或者號碼不符合規定! 15位號碼應全為數字,18位號碼末位可以為數字或X。"); return false; } //校驗位按照ISO 7064:1983.MOD 11-2的規定生成,X可以認為是數字10。 //下面分別分析出生日期和校驗位 var len, re; len = num.length; if (len == 15) { re = new RegExp(/^(d{6})(d{2})(d{2})(d{2})(d{3})$/); var arrSplit = num.match(re); //檢查生日日期是否正確 var dtmBirth = new Date("19" + arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { //alert("輸入的身份證號里出生日期不對!"); return false; } else { //將15位身份證轉成18位 //校驗位按照ISO 7064:1983.MOD 11-2的規定生成,X可以認為是數字10。 var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"); var nTemp = 0, k; num = num.substr(0, 6) + "19" + num.substr(6, num.length - 6); for (k = 0; k < 17; k++) { nTemp += num.substr(k, 1) * arrInt[k]; } num += arrCh[nTemp % 11]; return true; } } if (len == 18) { re = new RegExp(/^(d{6})(d{4})(d{2})(d{2})(d{3})([0-9]|X)$/); var arrSplit = num.match(re); //檢查生日日期是否正確 var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]); var bGoodDay; bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4])); if (!bGoodDay) { //alert(dtmBirth.getYear()); //alert(arrSplit[2]); //alert("輸入的身份證號里出生日期不對!"); return false; } else { //檢驗18位身份證的校驗碼是否正確。 //校驗位按照ISO 7064:1983.MOD 11-2的規定生成,X可以認為是數字10。 var valnum; var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); var arrCh = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"); var nTemp = 0, k; for (k = 0; k < 17; k++) { nTemp += num.substr(k, 1) * arrInt[k]; } valnum = arrCh[nTemp % 11]; if (valnum != num.substr(17, 1)) { //alert("18位身份證的校驗碼不正確!應該為:" + valnum); return false; } return true; } } return false; }
不為空
/** * * @Dependence : https://gist.github.com/hehongwei44/3e167cfcda47d4c8051a#file-extendstringprototype-js * @description : 判斷輸入的參數是否為空 * @return : true表示為輸入參數為空 * */ var isEmpty = function (str) { //空引用 空字符串 空輸入 return str === null || typeof str === "undefined" || String(str).replace(/^s+|s+$/g, "").length === 0 ? true : false; }
郵編
/** * * @descrition:判斷輸入的參數是否是國內合法的郵編地址(ps:國內不包含國外的郵編) * @link: http://www.youbianku.com/%E9%A6%96%E9%A1%B5 * @param: str為待驗證的郵編號碼 * @return: true表示為合法的郵編號碼 * */ var isPostcode = function(str) { //國內郵編以0-8開頭的6為數字 var pattern = /^[0-8]d{5}$/; return pattern.test(str); }
銀行卡
//Description: 銀行卡號Luhm校驗 //Luhm校驗規則:16位銀行卡號(19位通用): // 1.將未帶校驗位的 15(或18)位卡號從右依次編號 1 到 15(18),位于奇數位號上的數字乘以 2。 // 2.將奇位乘積的個十位全部相加,再加上所有偶數位上的數字。 // 3.將加法和加上校驗位能被 10 整除。 //bankno為銀行卡號 banknoInfo為顯示提示信息的DIV或其他控件 function luhmCheck(bankno){ var lastNum=bankno.substr(bankno.length-1,1);//取出最后一位(與luhm進行比較) var first15Num=bankno.substr(0,bankno.length-1);//前15或18位 var newArr=new Array(); for(var i=first15Num.length-1;i>-1;i--){ //前15或18位倒序存進數組 newArr.push(first15Num.substr(i,1)); } var arrJiShu=new Array(); //奇數位*2的積 <9 var arrJiShu2=new Array(); //奇數位*2的積 >9 var arrOuShu=new Array(); //偶數位數組 for(var j=0;j9 的分割之后的數組個位數 var jishu_child2=new Array();//奇數位*2 >9 的分割之后的數組十位數 for(var h=0;h 9 的分割之后的數組個位數之和 var sumJiShuChild2=0; //奇數位*2 >9 的分割之后的數組十位數之和 var sumTotal=0; for(var m=0;m 視頻格式
六、總結
/^https?.+.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4)$/i.test(string)1.首先給定校驗的規則(需要跟產品討論)
2.熟悉正則表達式的模式 (practice)
3.多實踐,一下不看別人的代碼(todo)引用的資料:
https://segmentfault.com/a/11...
https://developer.mozilla.org...xyz ?
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/91032.html
摘要:正則表達式一直是里比較難以掌握的點。在中創建正則的兩種方式使用字面量這就是正則表達式的字面量語法,表示正則表達式的模式,為正則表達式的標志。字面量形式的正則表達式一般使用較多,也推薦大家盡可能使用這種形式,簡潔易讀,符合正常的使用習慣。 正則表達式一直是js里比較難以掌握的點。 看不懂,學不會,記不住。 每次需要用到正則的時候,都需要再去查找資料。 今天花時間把正則的知識點總結下,希望...
摘要:選擇分組和引用正則表達式的語法還包括指定選擇項子表達式分組和引用前一子表達式的特殊字符。帶圓括號的表達式的另一個用途是允許在同一正則表達式的后部引用前面的子表達式。 正則表達式(regular expression)是一個描述字符模式的對象。JavaScript的 RegExp類 表示正則表達式,String和RegExp都定義了方法,后者使用正則表達式進 行強大的模式匹配和文本檢索與...
閱讀 966·2023-04-26 02:49
閱讀 1177·2021-11-25 09:43
閱讀 2549·2021-11-18 10:02
閱讀 2923·2021-10-18 13:32
閱讀 1285·2019-08-30 13:54
閱讀 2081·2019-08-30 12:58
閱讀 3015·2019-08-29 14:06
閱讀 2155·2019-08-28 18:10