一些有趣的js正则表达式

  • 金钱数字格式化 ( 99999999 => 99,999,999 )
    '99999999'.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,');
  • 删除重复相邻字符( ‘aaabbbcdfgghhjjkkk’ -> ‘abcdfghjk’)
    'aaabbbcdfgghhjjkkk'.replace(/([A-Za-z]{1})(\1)+/g, '$1');
  • 字符串中单词首字母大写( ’ hi man good luck ’ -> ’ Hi Man Good Luck’)
    ' hi man good  luck '.replace(/\w+/g, function(word) { return word.substr(0,1).toUpperCase() + word.substr(1)});
  • 身份证校验
    // 校验 身份证
isCardID: function ( cardID ) {
        var _vcity = {
            : "北京", 12 : "天津", 13 : "河北", 14 : "山西", 15 : "内蒙古",
            : "辽宁", 22 : "吉林", 23 : "黑龙江", 31 : "上海", 32 : "江苏",
            : "浙江", 34 : "安徽", 35 : "福建", 36 : "江西", 37 : "山东",
            : "河南", 42 : "湖北", 43 : "湖南", 44 : "广东", 45 : "广西",
            : "海南", 50 : "重庆", 51 : "四川", 52 : "贵州", 53 : "云南",
            : "西藏", 61 : "陕西", 62 : "甘肃", 63 : "青海", 64 : "宁夏",
            : "新疆", 71 : "台湾", 81 : "香港", 82 : "澳门", 91 : "国外"
        };
        // 检查号码是否符合规范,包括长度,类型
        var _isCardNo = function (obj) {
            // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
            return /(^\d{15}$)|(^\d{17}(\d|X)$)/.test(obj);
        };
        // 取身份证前两位,校验省份
        var _checkProvince = function (obj) {
            var province = obj.substr(0, 2);
            return !!_vcity[province];
        };
        // 检查生日是否正确
        var _checkBirthday = function (obj) {
            var len = obj.length
                ,arr_data, year, month, day, birthday;
            // 身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
            if (len == '15') {
                var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
                arr_data = obj.match(re_fifteen);
                year = arr_data[2];
                month = arr_data[3];
                day = arr_data[4];
                birthday = new Date('19' + year + '/' + month + '/' + day);
                return _verifyBirthday('19' + year, month, day, birthday);
            }
            // 身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
            if (len == '18') {
                var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
                arr_data = obj.match(re_eighteen);
                year = arr_data[2];
                month = arr_data[3];
                day = arr_data[4];
                birthday = new Date(year + '/' + month + '/' + day);
                return _verifyBirthday(year, month, day, birthday);
            }
            return false;
        };
        // 校验日期
        var _verifyBirthday = function (year, month, day, birthday) {
            var now = new Date();
            var now_year = now.getFullYear();
            // 年月日是否合理
            if (birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day) {
                // 判断年份的范围(0岁到150岁之间)
                var time = now_year - year;
                return (time >= 0 && time <= 150);
            }
            return false;
        };
        // 校验位的检测
        var _checkParity = function (obj) {
            // 15位转18位
            obj = _changeFifteenToEighteen(obj);
            var len = obj.length;
            if (len == '18') {
                var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
                    ,arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
                    ,cardTemp = 0,
                    i,
                    valnum;
                for (i = 0; i < 17; i++) {
                    cardTemp += obj.substr(i, 1) * arrInt[i];
                }
                valnum = arrCh[cardTemp % 11];
                return (valnum == obj.substr(17, 1));
            }
            return false;
        };
        // 15位转18位身份证号
        var _changeFifteenToEighteen = function (obj) {
            if (obj.length == '15') {
                var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
                var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
                var cardTemp = 0,
                    i;
                obj = obj.substr(0, 6) + '19' + obj.substr(6, obj.length - 6);
                for (i = 0; i < 17; i++) {
                    cardTemp += obj.substr(i, 1) * arrInt[i];
                }
                obj += arrCh[cardTemp % 11];
                return obj;
            }
            return obj;
        };
        // 去首尾空字符,在进行非空校验
        if ( (cardID = this.trim(cardID)) === false ) {
            return false
        }
        // 校验长度,类型
        if ( _isCardNo(cardID) === false ) {
            return false;
        }
        // 检查省份
        if ( _checkProvince(cardID) === false ) {
            return false;
        }
        // 校验生日
        if ( _checkBirthday(cardID) === false ) {
            return false;
        }
        // 检验位的检测
        return _checkParity(cardID);

    };

猜你喜欢

转载自blog.csdn.net/guduyibeizi/article/details/55260296
今日推荐