常见正则表达式及身份证校验规则

Posted 嗨小叔的程序猿之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见正则表达式及身份证校验规则相关的知识,希望对你有一定的参考价值。

一、正则相关规则如下:

常用元字符

代码 说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

常用限定符

代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

常用反义词

代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

常用模式修正符

代码/语法 说明
i 表示在进行匹配的时候不区分大小写
m 多行识别.即将字符串视为多行,不管是那行都能匹配
s 将字符串视为单行,转义回车换行符作为普通字符
g 表示全局匹配
x 将模式中的空白忽略
A 强制从目标字符串开头匹配
D 强制尾部无任何内容.若使用$限制结尾字符,则不允许结尾有换行
U 禁止贪婪匹配,只匹配最近的一个字符串(不重复匹配)
e 配合php函数preg_replace()使用,可以把匹配来的字符串当作正则表达式执行

二、数字校验的表达式

1、是否数字:

^[0-9]*$

2、n 位的数字:

^d{n}$

3、至少 n 位的数字:

^d{n,}$

4、m-n 位的数字:

^d{m,n}$

5、零和非零开头的数字:

^(0|[1-9][0-9]*)$

6、非零开头的最多带两位小数的数字:

^([1-9][0-9]*)+(.[0-9]{1,2})?$

7、带1-2位小数的正数或负数:

^(-)?d+(.d{1,2})?$

8、正数、负数、和小数:

^(-|+)?d+(.d+)?$

9、有两位小数的正实数:

^[0-9]+(.[0-9]{2})?$

10、有1~3位小数的正实数:

^[0-9]+(.[0-9]{1,3})?$

11、非零的正整数:

^[1-9]d$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]*$

12、非零的负整数:

^-[1-9][]0-9"$ 或 ^-[1-9]d$

13、非负整数:

^d+$ 或 ^[1-9]d*|0$

14、非正整数:

^-[1-9]d*|0$ 或 ^((-d+)|(0+))$

15、非负浮点数:

^d+(.d+)?$ 或

^[1-9]d.d|0.d[1-9]d|0?.0+|0$

16、非正浮点数:

^((-d+(.d+)?)|(0+(.0+)?))$ 或

^(-([1-9]d.d|0.d[1-9]d))|0?.0+|0$

17、正浮点数:

^[1-9]d.d|0.d[1-9]d$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$

18、负浮点数:

^-([1-9]d.d|0.d[1-9]d)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$

19、浮点数:

^(-?d+)(.d+)?$ 或

^-?([1-9]d.d|0.d[1-9]d|0?.0+|0)$

三、字符校验的表达式

1, 汉字:

^[\u4e00-\u9fa5]{0,}$

2, 英文和数字:

^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

3, 长度为3-20的所有字符:

^.{3,20}$

4, 由26个英文字母组成的字符串:

^[A-Za-z]+$

5, 由26个大写英文字母组成的字符串:

^[A-Z]+$

6, 由26个小写英文字母组成的字符串:

^[a-z]+$

7, 由数字和26个英文字母组成的字符串:

^[A-Za-z0-9]+$

8, 由数字、26个英文字母或者下划线组成的字符串:

^w+$ 或 ^w{1,20}$

9, 中文、英文、数字包括下划线:

^[\u4e00-\u9fa5A-Za-z0-9_]+$

10, 只含有汉字、数字、字幕、下划线、下划线位置不限:

^[A-Za-z0-9_\u4e00-\u9fa5]+$

11, 可以输入含有^%&’,;=?$”等字符:

[^%&',;=?$"]+

12, 禁止输入含有~的字符:

[^~"]+

13, 不以xxx(如 jeffjade )开头(/结尾)的字符串

^(?!jeffjade).*$

^.*?(?<!jeffjade)$

四,特殊需求表达式

^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$ 或

w[-w.+]*@([A-Za-z0-9][-A-Za-z0-9]+.)+[A-Za-z]{2,14}
或:

[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

3, 手机号码:

^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])d{8}$


或者(带17段的)

/^0?(13[0-9]|15[012356789]|18[0123456789]|17[0123456789]|14[57])[0-9]{8}$/

推荐两个正则表达式的代码生成以及表达式校验正确与否的网址:

(1)正则表达式在线生成工具:
            http://tools.jb51.net/regex/create_reg

(2)javascript正则表达式在线测试工具:

            http://tools.jb51.net/regex/javascript


五、身份证号码校验。

        先了解下身份证的位数以及以及规则定义,身份证号有15位和18位。

        早期身份证为15位的,目前已经停用,目前统一都是18位的身份证号码。

        18位身份证定义如下:

        

        18位的身份证号码最后一位是数字校验码,是根据前17位按照ISO 7064:1983.MOD 11-2校验码计算出来的。

(1)计算方法:

    1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;

    2、将这17位数字和系数相乘的结果相加;

    3、用加出来和除以11,看余数是多少;

    4、余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;

    5、通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的X。如果余数是10,身份证的最后一位号码就是2;

    例如:某男性的身份证号码是34052419800101001X。我们要看看这个身份证是不是合法的身份证。

    首先:我们计算3*7+4*9+0*10+5*5+...+1*2,前17位的乘积和是189

    然后:用189除以11得出的结果是商17余2

    最后:通过对应规则就可以知道余数2对应的数字是x。所以,这是一个合格的身份证号码。

    以下代码摘些嗨小叔参与过的项目中写的一段身份证校验供各位参考:


//检查号码是否符合规范,包括长度,类型
isCardNo = function(cardNo)
{
    //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
    var reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
    if(reg.test(cardNo) === false)
    {
        return false;
    }

    return true;
};

    //城市定义
    var vcity={ 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:"国外"
           };
//取身份证前两位,校验省份
checkProvince = function(cardNo)
{
    var province = cardNo.substr(0,2);
    if(vcity[province] == undefined)
    {
        return false;
    }
    return true;
};

//检查生日是否正确
checkBirthday = function(cardNo)
{
    var len = cardNo.length;
    //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
    if(len == '15')
    {
        var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
        var arr_data = cardNo.match(re_fifteen);
        var year = arr_data[2];
        var month = arr_data[3];
        var day = arr_data[4];
        var 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)$/;
        var arr_data = cardNo.match(re_eighteen);
        var year = arr_data[2];
        var month = arr_data[3];
        var day = arr_data[4];
        var birthday = new Date(year+'/'+month+'/'+day);
        return verifyBirthday(year,month,day,birthday);
    }
    return false;
};


//校验日期
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)
    {
        //判断年份的范围(3岁到100岁之间)
        var time = now_year - year;
        if(time >= 3 && time <= 100)
        {
            return true;
        }
        return false;
    }
    return false;
};

//校验位的检测
checkParity = function(cardNo)
{
    //15位转18位
    cardNo = changeFivteenToEighteen(cardNo);
    var len = cardNo.length;
    if(len == '18')
    {
        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 cardTemp = 0, i, valnum;
        for(i = 0; i < 17; i ++)
        {
            cardTemp += cardNo.substr(i, 1) * arrInt[i];
        }
        valnum = arrCh[cardTemp % 11];
        if (valnum == cardNo.substr(17, 1))
        {
            return true;
        }
        return false;
    }
    return false;
};

//15位转18位身份证号
changeFivteenToEighteen = function(cardNo)
{
    if(cardNo.length == '15')
    {
        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 cardTemp = 0, i;   
        cardNo = cardNo.substr(0, 6) + '19' + cardNo.substr(6, cardNo.length - 6);
        for(i = 0; i < 17; i ++)
        {
            cardTemp += cardNo.substr(i, 1) * arrInt[i];
        }
        cardNo += arrCh[cardTemp % 11];
        return cardNo;
    }
    return cardNo;
};


//身份证校验调用入口:

function checkCard(){
    var cardNo = document.getElementById('cardNo').value;
    //是否为空
    if(cardNo === '')
    {
        $("#cardNoIcon1").show();
        $("#cardNoIcon2").hide();
        $("#cardNoIcon_msg").hide();
        $("#cardNo_msg").html("身份证号码不能为空!");
        return false;
    }
    //校验长度,类型
    if(isCardNo(cardNo) === false)
    {
        $("#cardNoIcon1").show();
        $("#cardNoIcon2").hide();
        $("#cardNoIcon_msg").hide();
        $("#cardNo_msg").html("身份证号码不正确,请重新输入!");
        return false;
    }
    //检查省份
    if(checkProvince(cardNo) === false)
    {
        $("#cardNoIcon1").show();
        $("#cardNoIcon2").hide();
        $("#cardNoIcon_msg").hide();
        $("#cardNo_msg").html("身份证号码不正确,请重新输入!");
        return false;
    }
    //校验生日
    if(checkBirthday(cardNo) === false)
    {
        $("#cardNoIcon1").show();
        $("#cardNoIcon2").hide();
        $("#cardNoIcon_msg").hide();
        $("#cardNo_msg").html("身份证号码生日不正确,请重新输入!");
        return false;
    }
    //检验位的检测
    if(checkParity(cardNo) === false)
    {
        $("#cardNoIcon1").show();
        $("#cardNoIcon2").hide();
        $("#cardNoIcon_msg").hide();
        $("#cardNo_msg").html("您的身份证校验位不正确,请重新输入!");
        return false;
        /* document.getElementById('card_no').focus(); */
    }


以上是关于常见正则表达式及身份证校验规则的主要内容,如果未能解决你的问题,请参考以下文章

身份证号码验证正则表达式及用法(包括:位数规则等)

转载 | 身份证号码的正则表达式及验证详解(JavaScript,Regex)

IOS正则表达式 (身份证电话汉字等常用条件筛选)

JS中有关正则表达式的一些常见应用

正则表达式

表单校验及正则表达式