ES引用类型 之 Regexp正则表达式(摘至javaScript 高程3)

通过 new 关键词来定义 RegExp 对象。

var patt1 = new RegExp();
or
var pat = /^ $/;

RegExp 对象有 3 个方法:test()exec() 以及 compile()
test() 检索字符串中指定的值。返回 true 或 false。
exec() 检索字符串中指定的值。返回找到的值,并确定其位置。
compile() 编译正则表达式。
支持正则表达式的 String 对象的方法

search 检索与正则表达式相匹配的值。
match 找到一个或多个正则表达式的匹配。
replace 替换与正则表达式匹配的子串。
split 把字符串分割为字符串数组。

常用的数字正则(严格匹配)

正则 含义
/ ^[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)
/ ^[1-9][0-9]{4,} $ / 匹配腾讯QQ号 ,腾讯QQ号从10000开始
/ ^\d{3}-\d{8}|\d{4}-\d{7} $ / 匹配国内电话号码 如 0511-4405222 或 021-87888822
/ ^[1-9]\d{5}(?!\d) $ / 匹配中国邮政编码

匹配身份证
中国的身份证为15位(一代)或18位(二代),区别在于二代证只是在一代证的第七位数字前加了19和在末尾加了一位验证码 ;将15位升级为18位,并解析18位号码构成(地址、生日、性别)
验证规则:
* 身份证15位编码规则:dddddd yymmdd xx p
* dddddd:6位地区编码
* yymmdd: 出生年(两位年)月日,如:910215
* xx: 顺序编码,系统产生,无法确定
* p: 性别,奇数为男,偶数为女
*
* 身份证18位编码规则:dddddd yyyymmdd xxx y
* dddddd:6位地区编码
* yyyymmdd: 出生年(四位年)月日,如:19910215
* xxx:顺序编码,系统产生,无法确定,奇数为男,偶数为女
* y: 校验码,该位数值可通过前17位计算获得
*
* 前17位号码加权因子为 Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ]
* 验证位 Y = [ 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ]
* 如果验证码恰好是10,为了保证身份证是十八位,那么第十八位将用X来代替
* 校验位计算公式:Y_P = mod( ∑(Ai×Wi),11 )
* i为身份证号码1…17 位; Y_P为校验码Y所在校验码数组位置

function isIdCardNo(idCard){
        var idCard = $('#cardId').val();
        //15位和18位身份证号码的正则表达式
        var regIdCard=/^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/;
        //如果通过该验证,说明身份证格式正确,但准确性还需计算
        if(regIdCard.test(idCard)){
            if(idCard.length == 18){
                var idCardWi = new Array( 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ); //将前17位加权因子保存在数组里
                var idCardY = new Array( 1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2 ); //这是除以11后,可能产生的11位余数、验证码,也保存成数组
                var idCardWiSum = 0; //用来保存前17位各自乖以加权因子后的总和
                for(var i = 0;i < 17; i++){
                    idCardWiSum += idCard.substring(i,i+1)*idCardWi[i];
                }
                var idCardMod = idCardWiSum % 11;//计算出校验码所在数组的位置
                var idCardLast = idCard.substring(17);//得到最后一位身份证号码

                //如果等于2,则说明校验码是10,身份证号码最后一位应该是X
                if(idCardMod == 2){
                    if( idCardLast == "X" || idCardLast == "x" ){
                            alert("恭喜通过验证啦!");
                            return true;
                        }else{
                            alert("身份证号码错误!");
                            return false;
                        }
                    }else{
                        //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
                        if( idCardLast == idCardY[idCardMod] ){
                            alert("恭喜通过验证啦!");
                            return true;
                        }else{
                            alert("身份证号码错误!");
                            return false;
                        }
                    }
                }
            }else{
                alert("身份证格式不正确");
                return false;
        }
    }

猜你喜欢

转载自blog.csdn.net/Amy_cloud/article/details/79219636
今日推荐