常用前端校验正则

本文提供了常用的前端验证正则表达式,包括手机号码、邮箱、邮编和身份证等的校验方法,并详细介绍了身份证号码的有效性验证逻辑及银行卡号的Luhn算法验证。

常用前端校验正则

  • 手机号码前端校验正则
function isValidMobile(phoneNum){
    return /^\d{11}$/.test(phoneNum);
}
  • 邮箱前端校验正则
function isValidEmail(email){
    return /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(email);
}
  • 邮编前端校验正则
function isValidPostCode(postCode){
    return /^[1-9][0-9]{5}$/.test(postCode);
}
  • 身份证前端校验正则
function isValidID(num){
    num = num.toUpperCase();
    if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
        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) {
            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, i;
            num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
            for (i = 0; i < 17; i++) {
                nTemp += num.substr(i, 1) * arrInt[i];
            }
            num += arrCh[nTemp % 11];
            return num;
        }
    }
    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) {
            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, i;
            for (i = 0; i < 17; i++) {
                nTemp += num.substr(i, 1) * arrInt[i];
            }
            valnum = arrCh[nTemp % 11];
            if (valnum != num.substr(17, 1)) {
                return false;
            }
            return num;
        }
    }
    return false;
}
  • 银行卡号前端正则校验
function isValidBankNum(bankno) {
    var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位(与luhn进行比较)
    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; j < newArr.length; j++) {
        if ((j + 1) % 2 == 1) { //奇数位
            if (parseInt(newArr[j]) * 2 < 9) arrJiShu.push(parseInt(newArr[j]) * 2);
            else arrJiShu2.push(parseInt(newArr[j]) * 2);
        } else //偶数位
        arrOuShu.push(newArr[j]);
    }

    var jishu_child1 = new Array(); //奇数位*2 >9 的分割之后的数组个位数
    var jishu_child2 = new Array(); //奇数位*2 >9 的分割之后的数组十位数
    for (var h = 0; h < arrJiShu2.length; h++) {
        jishu_child1.push(parseInt(arrJiShu2[h]) % 10);
        jishu_child2.push(parseInt(arrJiShu2[h]) / 10);
    }

    var sumJiShu = 0; //奇数位*2 < 9 的数组之和
    var sumOuShu = 0; //偶数位数组之和
    var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和
    var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和
    var sumTotal = 0;
    for (var m = 0; m < arrJiShu.length; m++) {
        sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
    }

    for (var n = 0; n < arrOuShu.length; n++) {
        sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
    }

    for (var p = 0; p < jishu_child1.length; p++) {
        sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]);
        sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]);
    }
    //计算总和
    sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2);

    //计算luhn值
    var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10;
    var luhn = 10 - k;

    if (lastNum == luhn) {
        return true;
    } else {
        return false;
    }
}
<think>好的,我现在需要回答用户关于JavaScript中纯数字校验正则表达式的问题。首先,用户的需求是寻找一个用于验证纯数字的正则表达式,应用在JavaScript中。 根据用户提供的引用,特别是引用[1]中提到的正则表达式,其中有一个例子是匹配浮点数的:^(-?\d+)(\.\d+)?$。不过用户需要的是纯数字,也就是整数,可能包括正整数和负整数,还有可能允许前导零吗?通常纯数字校验可能指的是整数,比如身份证中的某些部分(引用[3]中的例子)使用了\d来匹配数字。例如,身份证的正则表达式里用了^[1-9]\d{7},这表示以1-9开头,后面跟着7位数字,总共有8位,这可能排除了前导零的情况。 但用户的问题比较笼统,只是说“纯数字”,可能需要更通用的解决方案。通常,纯数字的正则表达式可能是^\d+$,这样会匹配一位或多位数字,包括前导零的情况。例如,像“0”、“123”都是有效的,但“0123”可能在某些情况下不被接受,如果不需要前导零的话,可能需要调整。 不过,根据引用[1]中的另一个例子,用于浮点数的正则表达式,其中整数部分是^(-?\d+),也就是允许可选的负号,后面跟着至少一个数字。所以如果用户允许负数,那正则表达式应该是^-?\d+$。如果只允许正整数,包括零,那就是^\d+$。如果需要排除前导零,比如不允许像“0123”这样的数字,但允许单独的“0”,那么正则表达式应该是^(0|[1-9]\d*)$。例如,引用[3]中的身份证部分使用了^[1-9]来确保不以零开头,但这里的情况可能不同。 所以需要确认用户的需求:是否允许负数?是否允许前导零?例如,用户可能需要验证像手机号码这样的纯数字,通常允许前导零吗?或者像年龄这样的数字,可能不允许负数,但允许零。因此,可能需要提供多个选项,并说明各自的应用场景。 根据引用[3],身份证的正则表达式部分使用了[1-9]来开头,所以如果用户想要排除前导零,可能需要类似的正则表达式。但用户的问题只是“纯数字”,所以可能最简单的就是^\d+$,允许任何数字序列,包括前导零,但不包括负号。如果允许负号,则加上可选的负号。 另外,在JavaScript中,使用正则表达式的方式有两种,一种是字面量形式,如/^\d+$/,另一种是使用RegExp对象。例如引用[2]中的例子var reg2 = new RegExp("aaa","i");,但用户的问题可能更倾向于字面量形式。 综合以上分析,用户可能的场景是输入一个纯数字字符串,比如表单中的年龄、数量等,可能需要正整数,不允许负号,可能允许或不允许前导零。因此,应该给出不同的情况的正则表达式: 1. 允许正负整数:^-?\d+$ 2. 仅正整数(包括前导零):^\d+$ 3. 正整数,不允许前导零(除了零本身):^(0|[1-9]\d*)$ 此外,还需要考虑是否允许前导或末尾的空格。通常在前端校验中,会先trim字符串,或者在正则表达式中严格匹配开始和结束,如^和$,如引用[3]中的例子。所以正则表达式应该包含^和$,以确保整个字符串都是数字。 例如,如果用户输入的是“123”,应该匹配;输入“-123”如果允许负号则匹配,否则不匹配。输入“0123”是否允许取决于具体需求,但默认情况下,^\d+$是允许的。 所以正确的正则表达式可能包括: - 允许正负整数:/^-?\d+$/ - 仅正整数(允许前导零):/^\d+$/ - 仅正整数(不允许前导零):/^(0|[1-9]\d*)$/ 需要根据用户的具体需求来选择。此外,在JavaScript中使用test方法进行验证,如引用[2]中的例子,使用reg.test(str)返回布尔值。 因此,回答中应该提供这些不同的正则表达式选项,并说明它们的适用情况,同时给出示例代码,如: var reg = /^-?\d+$/; if (reg.test(input)) { ... } 或者如果用户只需要正整数,不允许负号: var reg = /^\d+$/; 或者不允许前导零: var reg = /^(0|[1-9]\d*)$/; 同时需要提醒用户,如果输入可能包含前后空格,应该先使用trim()方法处理,或者在正则表达式中处理,但通常建议先trim。 现在检查引用中的内容是否正确: 引用[1]提到浮点数的正则表达式,其中整数部分为-?\d+,所以纯数字的正则表达式可以借鉴这个部分。引用[3]中的身份证正则表达式部分使用了[1-9]来开头,排除前导零的情况。引用[2]中的例子展示了如何创建正则表达式对象。引用[4]中的密码校验涉及更复杂的规则,但这里不需要。 因此,总结回答:根据需求,给出不同的正则表达式,并解释它们的用途,同时提供JavaScript中的使用示例。</think>在JavaScript中校验纯数字的常用正则表达式如下: ### 1. **允许正负整数** 正则表达式:`/^-?\d+$/` - `^` 表示字符串开始 - `-?` 表示可选负号 - `\d+` 表示1个或多个数字 - `$` 表示字符串结束 示例:`"-123"`、`"456"` 有效,`"12a"`、`"12.3"` 无效[^1]。 ### 2. **仅正整数(允许前导零)** 正则表达式:`/^\d+$/` - 匹配如 `"0"`、`"123"`、`"0123"` 等纯数字字符串[^3]。 ### 3. **仅正整数(不允许前导零)** 正则表达式:`/^(0|[1-9]\d*)$/` - `0` 单独匹配零 - `[1-9]\d*` 表示非零开头的数字(如 `"123"`) - 有效示例:`"0"`、`"123"`,无效示例:`"0123"`[^3]。 ### JavaScript代码示例 ```javascript // 允许正负整数 const reg1 = /^-?\d+$/; console.log(reg1.test("123")); // true console.log(reg1.test("-456")); // true console.log(reg1.test("12a")); // false // 仅正整数(允许前导零) const reg2 = /^\d+$/; console.log(reg2.test("0123")); // true // 仅正整数(不允许前导零) const reg3 = /^(0|[1-9]\d*)$/; console.log(reg3.test("0123")); // false console.log(reg3.test("123")); // true ``` ### 注意事项 - 若输入可能含空格,需先使用 `.trim()` 处理字符串。 - 若需限定数字范围(如手机号长度),可调整量词,如 `\d{11}` 匹配11位数字。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值