Android | Java开发学习正则表达式的笔记

以前真的没怎么认真考虑一个正则匹配应该怎么写,自从昨天看了一位老师的正则表达式的讲解,感觉也不难,基本简单的多写几次就来感觉了,下面是我自己边学习边记录写的几个正则表达式。经过校验大部分还算正确,余下有bug部分后期再修复

package regex;

public class RegexDemo {
    public static void main(String[] args) {
//        runTest();
//        police();
//        phone400();
        IDCard();
    }

    /**
     * 校验身份证:
     * 身份证规则
     * 前两位代表省份,11-65
     * 后四位位代表城市所在的区,
     * 后8位代表出生年月日,
     * 最后四位代表校验结果,最后一位可能为X
     * 总计18位数(最后一位有可能是X)
     */
    private static void IDCard() {
//        String IDCardRegex = "[1-6|1-5{2}]\\d{4}1\\d{3}(0\\d|11|12)[\\d{4}]";
        //示例 :4222011956129999
//        String IDCardRegex = "([1-6]|[1-5]){2}\d{4}1\d{3}(0\d|10|11|12)(\d|X){4}";
        //身份证前两位:([1-6]|[1-5]) 继续后四位:\d{4} 后四位出生年份:1\d{3} 月份:(0\d|10|11|12) 身份证最后四位 \d{4}
//        String IDCardRegex = "([1-6]|[1-5]){2}\\d{4}1\\d{3}(0\\d|10|11|12)(\\d|X){4}";

        //----------------------------------下面是完整版本身份证的正则表达式------------------------------------//
        /**
         * 完整版本身份证正则:
         * 身份证前两位:([1-6]|[1-5])
         * 继续后四位:\d{4}
         * 后四位出生年份:1\d{3}
         * 月份:(0\d|10|11|12)
         * 代表出生日:([0-2]\d|30)
         * 身份证最后四位 \d{4}
         */
//        String IDCardRegex = "([1-6]|[1-5]){2}\\d{4}1\\d{3}(0\\d|10|11|12)([0-2]\\d|30|31)(\\d|X){4}";
        //支持2000年后的版本,最大支持2023年出生孩子的身份证信息 
        // 代表1000-2023年:(1\d{3}|(200\d|201\d|202[0-3]))->也可这样写:(1\d{3}|20(0\d|1\d|2[0-3]))
        String IDCardRegex = "([1-6]|[1-5]){2}\\d{4}(1\\d{3}|20(0\\d|1\\d|2[0-3]))(0\\d|10|11|12)([0-2]\\d|30|31)(\\d|X){4}";
        System.err.println("42220120231231999X".matches(IDCardRegex));//true
        System.err.println("72220120231231999X".matches(IDCardRegex));//身份证开头没有7 false
        System.err.println("42220120241231999X".matches(IDCardRegex));//大于2023年false
        System.err.println("42220120231531999X".matches(IDCardRegex));//大于12月false
        System.err.println("42220120231241999X".matches(IDCardRegex));//大于31号false
        System.err.println("42220120231231999a".matches(IDCardRegex));//非数字或者X false
    }

    /**
     * 400-电话正则
     * 一般以400开头,后面可能是-也可能数空格
     * 一般长度10位加上空格或者-的话总计12位
     */
    private static void phone400() {
        //这个规则可能会出现不正确的情况
        //类似这两种:400-1234-5555(长度超过了10位)   400-333-333(长度不够10位)
        String phoneRegex = "400([\\s|-]\\d{3,4}){2}";
        //下面是固定规则400开头再加3位数字最后加四位数字
        String phoneRegexTure = "400[\\s|-]\\d{3}[\\s|-]\\d{4}";
        System.err.println("400 234 7777".matches(phoneRegexTure));
        System.err.println("400-234-0000".matches(phoneRegexTure));
    }

    /**
     * 紧急急救电话正则
     * 一般是3位数,第一位1开头,第二位1或者2开头
     * 举例:110 120 119
     */
    private static void police() {
        String policeRegex = "1[1-2]\\d";
        String policeRegex2 = "1[1-2][0|9]";
        System.err.println("120".matches(policeRegex2));
    }

    /**
     * 验证目前最新的手机号
     * 规则:
     * 第一位是1开头,第二位可以是3-9之间的任意数字
     * 从第三位开始可以是任意数字
     */
    private static void runTest() {
        String regex = "1[^1-2]\\d{9}";
        System.out.println("11155225158".matches(regex));
    }
}

如上所示,分别写了验证手机号,验证紧急电话、验证400开头企业电话、验证身份证号码(身份证号码已支持2000年后出生孩子的身份证信息校验了)。基本分析和注释都写在下面了,看不懂没关系,自己跟着多写几次理解了就懂了

身份证介绍比较详细的文章可以看这个:身份证前6位代表含义的详细说明

猜你喜欢

转载自blog.csdn.net/xiayiye5/article/details/128665450