java学习日记1

正则表达式的学习

java用正则表达式要判断身份证号

第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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值