今天交学费,使用工行的网银转账,在转账的时候,发现客户输入的账号,没有自动的位数隔开的识别,比如说满四位就自动添加一个横线或者添加空格之类的东西。我相信基本上每个汇款的用户都会至少核对一遍账号,这样的一堆紧挨着的数字让人看起来真的是很不舒服的。偶然想起来,前一段时间学的js的关于这块儿的匹配处理,现在把教程上的代码,整理出来,重新回顾一下js正则表达式的使用。
var reMasterCard =/^5[1-5]\d{14}$/; //^表示开头,$表示结尾
//实际中可能有空格和横线
var reMasterCard =/^5[1-5]\d{2}[\s\-]?\d{4}[\s\-]?\d{4}[\s\-]?\d{4}$/;
//使用捕获型分组,以备将来验证唯一性
var reMasterCard =/^(5[1-5]\d{2})[\s\-]?(\d{4})[\s\-]?(\d{4})[\s\-]?(\d{4})$/;
//构建函数:
function isValidMasterCard (sText){
var reMasterCard =/^(5[1-5]\d{2})[\s\-]?(\d{4})[\s\-]?(\d{4})[\s\-]?(\d{4})$/;
if(reMasterCard.test(sText)){
var sCardNum =RegExp.$1+RegExp.$2+RegExp.$3+RegExp.$4;
//此处添加逻辑处理,调用验证的方法
return luhnCheckSum(sCardNum);
}else{
return false;
}
}
Luhn算法:
function luhnCheckSum(sCardNum){
var iOddSum =0;
var bIsOdd=true;
for (var i = sCardNum.length-1;i=0;i--){
var iNum =parseInt(sCardNum.charAt(i));
//将奇数位上的数字相加
if(bIsOdd){
iOddSum+=iNum;
//将偶数位上的数字*2后相加
}else{
iNum =iNum*2;
//如果加起来的数字为两位数,那么就将个位和十位的数字相加得到新的位数,
if(iNum>9){
iNum=eval(iNum.toString().split("").join("+"));
}
//将所有的偶数位上的数字相加
iEvenSum+=iNum;
}
bIsOdd=!=bIsOdd;
}
//判断,循环完后,奇数为的和与偶数位的和相加后的结果是否可以被10整除
rerurn ((iEvenSum+iOddSum)%10==0);
}
调用:
alert(isValidMasterCard("5432 1234 5678 9012")); //false
alert(isValidMasterCard("5432-1234-5678-9012")); //false
alert(isValidMasterCard("5432123456789012")); //false
总结:
1.js的正则表达式规则跟C#大致相似,区分脱字符(^)和表示开头的^符号的一个方法是,表示托字符的^要放到[]中,表示开头的^不能放到[]中。
2.正则表达式中的引用和缓存是一种想通的设计思想,当初在学习的时候,并没有主动的去思考这个问题,说明,在针对程序的编程思想上需要继续做更多的提炼和积累,这样将来在遇到类似的问题或者知识的时候,在潜意识中就会去引领自己思考,这样才体现出程序的灵魂所在。