开发工具与关键技术:Visual Studio ASP.NET MVC

作者:刘剑鸿

撰写时间:2019年5月02日 星期四

用正则表达式进行身份证验证

正则表达式又称规则表达式,它的英文名字为Regular Expression。而代码中常简写为regex、regexp或RE。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。简单的说就是正则表达式是用于进行文本匹配的工具。

比如说:each、eat、eager、dear 在这个字符串中匹配出eat,就应该这样书写正则表达式:\beat\b, \b是正则表达式规定的一个特殊代码,我们把它叫做元字符,单词的开头或结尾,也就是单词的分界处,它只匹配一个位置。其实不仅
\b一个元字符,还有好几个我们常用的:

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

看起来是有好多东西要记,不过用多了几自然熟了。不仅要熟悉元字符,还有常用的限定符
代码 说明

*          重复零次或更多次

            +         重复一次或更多次

            ?          重复零次或一次

            {n}       重复n次

            {n,}   重复n次或更多次

        {n,m}       重复n到m次

还有一个挺重要的反义字符,

代码/语法  说明

            \W   匹配任意不是字母,数字,下划线,汉字的字符

            \S    匹配任意不是空白符的字符

            \D   匹配任意非数字的字符

            \B    匹配不是单词开头或结束的位置

      [^x]     匹配除了x以外的任意字符

正则表达式还有许多重要的匹配字符,现在已经把验证身份证所用到的字符都列出来。下面是 jquery验证身份证号方法

function idCardNo(value) {

var area = { 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: "xinjiang", 71: "台湾", 81: "香港", 82: "澳门", 91: "国外" }

var idcard, Y, JYM;

var idcard = value;

var S, M;

var idcard_array = new Array();

idcard_array = idcard.split("");

if (area[parseInt(idcard.substr(0, 2))] == null) return false;

switch (idcard.length) {

    case 15:

        if ((parseInt(idcard.substr(6, 2)) + 1900) % 4 == 0 ||
 ((parseInt(idcard.substr(6, 2)) + 1900) % 100 == 0 && (parseInt(idcard.substr(6,
2)) + 1900) % 4 == 0)) {

            ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$/; //测试出生日期的合法性

        }

        else {

            ereg = /^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$/; //测试出生日期的合法性

        }

        if (ereg.test(idcard))

            //return Errors[0];

            var res = true;

        else

            //return Errors[2];

            var res = false;

        return res;

        break;

    case 18:

        if (parseInt(idcard.substr(6, 4)) % 4 == 0 ||
 (parseInt(idcard.substr(6, 4)) % 100 == 0 && parseInt(idcard.substr(6,
4)) % 4 == 0)) {

            ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$/; //闰年出生日期的合法性正则表达式

        }

        else {

            ereg = /^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$/; //平年出生日期的合法性正则表达式

        }

        if (ereg.test(idcard)) {

            S = (parseInt(idcard_array[0])
 + parseInt(idcard_array[10])) * 7 + (parseInt(idcard_array[1]) +
parseInt(idcard_array[11])) * 9 + (parseInt(idcard_array[2]) + parseInt(idcard_array[12]))
 * 10 + (parseInt(idcard_array[3]) + parseInt(idcard_array[13])) * 5 +
   (parseInt(idcard_array[4]) + parseInt(idcard_array[14])) * 8 +
 (parseInt(idcard_array[5]) + parseInt(idcard_array[15])) * 4 +
(parseInt(idcard_array[6]) + parseInt(idcard_array[16])) * 2 +
parseInt(idcard_array[7]) * 1 + parseInt(idcard_array[8]) * 6 +
parseInt(idcard_array[9]) * 3;

            Y = S % 11;

            M = "F";

            JYM = "10X98765432";

            M = JYM.substr(Y, 1);

            if (M == idcard_array[17])

                //return Errors[0];

                var res = true;

            else

                //return Errors[3];

                var res = false;

        }

        else

            //return Errors[2];

            res = false;

        return res;

        break;

    default:

        res = false;

        return res;

        break;

};

}

上面用到 switch语句,因为以前的身份证是15位的,而现在都是18位。这些都是封装好的方法。需要时就直接复制过去用就行。下面是将正则表达式验证身份证的合法性的验证:

Python正则表达式身份证号15位 正则表达式身份证匹配_元字符

(本截图来自RegexBuddy)

图中下面身份证号码的金黄色背景表示匹配正确!若输入一个不合法的身份证号码则:

Python正则表达式身份证号15位 正则表达式身份证匹配_字符串_02