第18位比较特殊需要单独拿出来判断,通过加权取余可以知道最后一位的数字,然后将这位数字转换成String并且将其拼接到上面正则表达式的后面。
代码我还是贴在这。
PS:我对身份证前6位的判断只判断了前两位的地区码,第2位到第六位的地区码没有判断,所以一定会有错
这份代码没有判断位数是否相等,以及最后一位输入的时候是X还是x没有判断。但是加上了是否为出生年份是否为闰年相应的判断(可能不准,毕竟我没找到恰好闰年2月29日出生人的身份证号码,所以不好判断)
private static String[] lastNumModel;
private static String myID;
private static int[] weight;
private static String addressID;
public static void main(String[] args) {
Privatedata(); //输入身份证号码
getvaluesum();
}
public static void Privatedata(){
Scanner in=new Scanner(System.in);
lastNumModel= new String[]{"1", "0", "10", "9", "8", "7", "6", "5", "4", "3", "2", "1", "x"};
weight= new int[]{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};//身份证前17位对应的系数
addressID=new String("^(11|12|13|14|21|22|23|31|32|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)"); //前两位的地址码
System.out.println("enter you ID");
myID=in.nextLine();
}
public static void getvaluesum(){
int lastIntNum=0;
int[] arr=new int[17];
String IDcard;
for (int i = 0; i <17; i++) {
arr[i]=Integer.parseInt(myID.substring(i,i+1));
}
//算出身份证后最后一位
for (int i = 0; i < 17; i++) {
lastIntNum+=arr[i]*weight[i];
}
int year=arr[6]*1000+arr[7]*100+arr[8]*10+arr[9];
if((year%4==0&&year%100!=0)||year%400==0) {
// /-------前6位------|-----year---|----每个月的前19天------------|除去2月的前20-30天----------|2月的20-29-|---------第31天---------|排序位
IDcard =addressID+"[0-7]\\d{3}(19|20)\\d{2}((((0[1-9])|1(1|2))(0|1)[1-9])|(((01|0[3-9])2[1-9]))|(30)|(022[0-9])|(01|03|05|07|08|10|12)31)\\d{3}"
+getLastNum(lastNumModel,lastIntNum);
}
else { //-------前6位------|-----year---|----每个月的前19天------------|除去2月的20-30日-------------|2月的20-28-|---------第31天---------|排序位
IDcard = addressID+"[0-7]\\d{3}(19|20)\\d{2}((((0[1-9])|1(1|2))(0|1)[1-9])|(((0[^02\\D](2[1-9]))|(30))|(022[0-8])|(01|03|05|07|08|10|12)31) \\d{3}"
+getLastNum(lastNumModel,lastIntNum);
}
System.out.println(myID.matches(IDcard));
}
//根据前17位数字来判断第18位数字是否与输入的相同
public static String getLastNum(String []lastNumModel,int num){
num = num%11;
return lastNumModel[num];
}
其二,我将身份证号以String的格式保存下来,所以在判断的时候就需要把String换成int或者int型数组
for (int i = 0; i <16; i++) {
arr[i]=Integer.parseInt(myID.substring(i,i+1));
}
在我的代码中还要将int型变成String型
Integer.toString(lastIntNum)
然后还做了一个判断IP是否合法的练习题
代码如下
class iptest {
public static void main(String[] args) {
String modelIP = "(2[0-4]\\d|25[0-5]|(0|1)?\\d?\\d\\.){3}(2[0-4]\\d|25[0-5]|(0|1)?\\d?\\d)";
String IPnum="192.168.1.2";
System.out.println(IPnum.matches(modelIP));;
}
}
这里犯了一个很低级的错误
在一开始的时候用equals判断两个字符串是否相等=-=,足足浪费了一个小时的时间,以为一直时反义问题=-=。这里应该用matches