正则表达式 手机号 车牌号 身份证 姓名

Android中手机号、车牌号正则表达式

  • 手机号

手机号的号段说明转载自:国内手机号码的正则表达式|蜗牛的积累

 手机名称有GSM:表示只支持中国联通或者中国移动2G号段(130、131、132、134、135、136、137、138、139、145、147、150、151、152、155、156、157、158、159、182、185、186、187、188)

手机名称有CDMA:表示只支持中国电信2G号段(133、153、180、181、189) 

手机名称有WCDMA/GSM:表示支持中国联通或者中国移动2G号段,以及中国联通3G号段(130、131、132、134、135、136、137、138、139、145、147、150、151、152、155、156、157、158、159、182、183、185、186、187、188),不支持 移动3G业务,不支持电信卡。

手机名称有TD-SCDMA/GSM:表示支持中国联通或者中国移动2G号段,以及中国移动3G号段(130、131、132、134、135、136、137、138、139、145、147、150、151、152、155、156、157、158、159、 182、183、185、186、187、188),不支持联通3G业务,不支持电信卡。

手机名称有CDMA2000/CDMA:表示支持中国电信2G号段,以及中国电信3G号段(133、153、180、181、189),不支持移动联通卡

手机名称有CDMA2000/GSM(双模双待):表示一张卡支持中国电信2G号段,以及中国电信3G号段(133、153、180、181、189),另一张卡支持中国移动或中国联通2G号段的语音和短信功能。

第三方运营商的170号码段

补充:联通4G 176、电信4G 177、移动4G 178号段

 

根据这些写出的正则表达式函数如下:

1 public static boolean isMobileNO(String mobiles) {
2 String telRegex = "13\\d{9}|14[57]\\d{8}|15[012356789]\\d{8}|18[01256789]\\d{8}|17[0678]\\d{8}"; 3 if (TextUtils.isEmpty(mobiles)) return false; 4 else return mobiles.matches(telRegex); 5 }

其中:

“13\\d{9}”指前两位为1和3,后面跟任意9位;

“14[57]\\d{8}”指前两位为1和4,第三位为5或7,后面跟任意8位;

以此类推。

 

  • 车牌号

车牌号的正则表达式网上一直有,没怎么变过:

复制代码
复制代码
1 public static boolean isCarnumberNO(String carnumber) {
2 /* 3  车牌号格式:汉字 + A-Z + 5位A-Z或0-9 4  (只包括了普通车牌号,教练车和部分部队车等车牌号不包括在内) 5 */ 6 String carnumRegex = "[\u4e00-\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}"; 7 if (TextUtils.isEmpty(carnumber)) return false; 8 else return carnumber.matches(carnumRegex); 9 }
复制代码
复制代码

当然这个正则表达式有局限性,比如第一位只限定是汉字,没限定只有34个省汉字缩写;车牌号不存在字母I和O,防止和1、0混淆;部分车牌无法分辨等等。

最后使用的是下面这个正则表达式,加入了以两位字母开头的车牌:

^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}

[a-zA-Z_0-9_\u4e00-\u9fa5]$|^[a-zA-Z]{2}\d{7}$


  • 身份证号

需要一个简单的验证身份证号的正则表达式,从网上查了很多,都有问题,主要是只要超过15位,都能够通过,于是自己查了半天手册,写了下面这个式子,能够满足简单的要求:
1、15位或18位,如果是15位,必需全是数字。
2、如果是18位,最后一位可以是数字或字母Xx,其余必需是数字。

/^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/

从这个表达式想到的:
1、正则表达式首先是要通过正确的
2、限制不正确
3、可以不限制其中的某此规则,但一定要让正确的先通过。


/*
 * 身份证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 validateIdCard(idCard){
 //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("恭喜通过验证啦!");
    }else{
     alert("身份证号码错误!");
    }
   }else{
    //用计算出的验证码与最后一位身份证号码匹配,如果一致,说明通过,否则是无效的身份证号码
    if(idCardLast==idCardY[idCardMod]){
     alert("恭喜通过验证啦!");
    }else{
     alert("身份证号码错误!");
    }
   }
  } 
 }else{
  alert("身份证格式不正确!");
 }
}









你可能感兴趣的:(正则表达式 手机号 车牌号 身份证 姓名)