常用正则表达式(强密码&手机号&身份证件号)

推荐使用hutool工具类

验证类

强密码校验(包含大小写字母和特殊字符,密码长度8-16位)

!ReUtil.isMatch("^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\\\\W_]).{8,16}$", userHead.getPassword())

手机号校验

String run(String param, Map<String, Object> map) {

    if (StringUtils.isBlank(param)) {
        return "手机号码为空或无效内容"
    }

    def validPhoneMap = new HashMap<>()
    validPhoneMap.put("台湾", "^(\\\\+?886\\\\-?|0)?9\\\\d{8}\\$")
    validPhoneMap.put("香港", "^(\\\\+?852\\\\-?)?[569]\\\\d{3}\\\\-?\\\\d{4}\\$")
    validPhoneMap.put("澳门", "^(\\\\+?853\\\\-?)?6\\\\d{7}\\$")
    validPhoneMap.put("马来西亚", "^(\\\\+?6?01){1}(([145]{1}(\\\\-|\\\\s)?\\\\d{7,8})|([236789]{1}(\\\\s|\\\\-)?\\\\d{7}))\\$")
    validPhoneMap.put("菲律宾", "^(\\\\+?0?63\\\\-?)?\\\\d{10}\\$")
    validPhoneMap.put("泰国", "^(\\\\+?0?66\\\\-?)?\\\\d{10}\\$")
    validPhoneMap.put("新加坡", "^(\\\\+?0?65\\\\-?)?\\\\d{10}\\$")
    /*以下是其他国家的手机号校验正则*/
    validPhoneMap.put("阿尔及利亚", "^(\\\\+?213|0)(5|6|7)\\\\d{8}\\$")
    validPhoneMap.put("叙利亚", "^(!?(\\\\+?963)|0)?9\\\\d{8}\\$")
    validPhoneMap.put("沙特阿拉伯", "^(!?(\\\\+?966)|0)?5\\\\d{8}\\$")
    validPhoneMap.put("美国", "^(\\\\+?1)?[2-9]\\\\d{2}[2-9](?!11)\\\\d{6}\\$")
    validPhoneMap.put("捷克共和国", "^(\\\\+?420)? ?[1-9][0-9]{2} ?[0-9]{3} ?[0-9]{3}\\$")
    validPhoneMap.put("德国", "^(\\\\+?49[ \\\\.\\\\-])?([\\\\(]{1}[0-9]{1,6}[\\\\)])?([0-9 \\\\.\\\\-\\\\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?\\$")
    validPhoneMap.put("丹麦", "^(\\\\+?45)?(\\\\d{8})\\$")
    validPhoneMap.put("希腊", "^(\\\\+?30)?(69\\\\d{8})\\$")
    validPhoneMap.put("澳大利亚", "^(\\\\+?61|0)4\\\\d{8}\\$")
    validPhoneMap.put("英国", "^(\\\\+?44|0)7\\\\d{9}\\$")
    validPhoneMap.put("加拿大", "^(\\\\+?1)?[2-9]\\\\d{2}[2-9](?!11)\\\\d{6}\\$")
    validPhoneMap.put("印度", "^(\\\\+?91|0)?[789]\\\\d{9}\\$")
    validPhoneMap.put("新西兰", "^(\\\\+?64|0)2\\\\d{7,9}\\$")
    validPhoneMap.put("南非", "^(\\\\+?27|0)\\\\d{9}\\$")
    validPhoneMap.put("赞比亚", "^(\\\\+?26)?09[567]\\\\d{7}\\$")
    validPhoneMap.put("西班牙", "^(\\\\+?34)?(6\\\\d{1}|7[1234])\\\\d{7}\\$")
    validPhoneMap.put("芬兰", "^(\\\\+?358|0)\\\\s?(4(0|1|2|4|5)?|50)\\\\s?(\\\\d\\\\s?){4,8}\\\\d\\$")
    validPhoneMap.put("法国", "^(\\\\+?33|0)[67]\\\\d{8}\\$")
    validPhoneMap.put("以色列", "^(\\\\+972|0)([23489]|5[0248]|77)[1-9]\\\\d{6}")
    validPhoneMap.put("匈牙利", "^(\\\\+?36)(20|30|70)\\\\d{7}\\$")
    validPhoneMap.put("意大利", "^(\\\\+?39)?\\\\s?3\\\\d{2} ?\\\\d{6,7}\\$")
    validPhoneMap.put("日本", "^(\\\\+?81|0)\\\\d{1,4}[ \\\\-]?\\\\d{1,4}[ \\\\-]?\\\\d{4}\\$")
    validPhoneMap.put("挪威", "^(\\\\+?47)?[49]\\\\d{7}\\$")
    validPhoneMap.put("比利时", "^(\\\\+?32|0)4?\\\\d{8}\\$")
    validPhoneMap.put("波兰", "^(\\\\+?48)? ?[5-8]\\\\d ?\\\\d{3} ?\\\\d{2} ?\\\\d{2}\\$")
    validPhoneMap.put("巴西", "^(\\\\+?55|0)\\\\-?[1-9]{2}\\\\-?[2-9]{1}\\\\d{3,4}\\\\-?\\\\d{4}\\$")
    validPhoneMap.put("葡萄牙", "^(\\\\+?351)?9[1236]\\\\d{7}\\$")
    validPhoneMap.put("俄罗斯", "^(\\\\+?7|8)?9\\\\d{9}\\$")
    validPhoneMap.put("塞尔维亚", "^(\\\\+3816|06)[- \\\\d]{5,9}\\$")
    validPhoneMap.put("土耳其", "^(\\\\+?90|0)?5\\\\d{9}\\$")
    validPhoneMap.put("越南", "^(\\\\+?84|0)?((1(2([0-9])|6([2-9])|88|99))|(9((?!5)[0-9])))([0-9]{7})\\$")
    /* 以下是匹配所有手机号校验正则*/
    validPhoneMap.put("所有", "^(\\\\+?0)?([0-9]*[1-9][0-9]*)\\$")

    if (!param.contains("+") || param.contains("+86")  || param.contains("+86-")) {
        def isTrue = Pattern.matches("^(\\\\+?86\\\\-?)?1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\\\d{8}\\$", param)
        if (isTrue) {
            return null
        }
    } else {
        for (def entry : validPhoneMap.entrySet()) {
            def isTrue = Pattern.matches(entry.getValue(), param)
            if (isTrue) {
                return null
            }
        }
    }

    return "手机号码格式不正确";

}

证件号码校验

String run(String param,Map<String,Object> map) {
    if (StringUtils.isBlank(param)) {
        return "证件类型为空或无效内容"
    }

    String idNo =  map.get("证件号码")

    if (StringUtils.isBlank(idNo)) {
        return "证件号码为空或无效内容"
    }

    def validMap = new HashMap<>()
    validMap.put("身份证", "(^\\\\d{8}(0\\\\d|10|11|12)([0-2]\\\\d|30|31)\\\\d{3}\\$)|(^\\\\d{6}(18|19|20)\\\\d{2}(0[1-9]|10|11|12)([0-2]\\\\d|30|31)\\\\d{3}(\\\\d|X|x)\\$)")
    validMap.put("护照", "(^[EeKkGgDdSsPpHh]\\\\d{8}\\$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\\\\d{7}\\$)")
    validMap.put("港澳台通行证", "(^[HMhm]{1}([0-9]{10}|[0-9]{8})\\$)|(^\\\\d{8}|^[a-zA-Z0-9]{10}|^\\\\d{18}\\$)")
    validMap.put("港澳台居民大陆居住证", "^8[123]0000(?:19|20)\\\\d{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\\\d|3[01])\\\\d{3}[\\\\dX]\\$")
    validMap.put("外国人居留证", "^[A-Z]{3}\\\\d{6}(?:0[1-9]|1[021])(?:0[1-9]|[21]\\\\d|3[10])\\\\d{2}\\$")

    if(null == validMap.get(param)){
        return "证件类型不匹配"
    }

    def isTrue = false

    if (param == "身份证") {
        isTrue = verifyID(idNo)
    } else if (validMap.get(param) != null) {
        isTrue = Pattern.matches(validMap.get(param), idNo)
    } else {
        isTrue = true
    }

    if (isTrue) {
        return null
    }

    return "证件号码格式不正确"

}

//身份证校验(完整)
boolean verifyID(String idcode){

    //长度校验
    if(idcode.length()!=18){
        return false;
    }

    // 加权因子
    int[] weight_factor = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];
    // 校验码
    String[] check_code = ['1', '0', 'X' , '9', '8', '7', '6', '5', '4', '3', '2'];

    String code = idcode;
    String last = idcode[17];//最后一位

    String seventeen = code.substring(0,17);

    // ISO 7064:1983.MOD 11-2
    // 判断最后一位校验码是否正确
    String[] arr = seventeen.split("");
    int len = arr.length;
    int num = 0;
    for(int i = 0; i < len; i++){
        num = num + Integer.valueOf(arr[i]) * Integer.valueOf(weight_factor[i]);
    }

    // 获取余数
    int resisue = num%11;
    String last_no = check_code[resisue];
    String idcard_patter = /^[1-9][0-9]{5}([1][9][0-9]{2}|[2][0][0|1][0-9])([0][1-9]|[1][0|1|2])([0][1-9]|[1|2][0-9]|[3][0|1])[0-9]{3}([0-9]|[X])$/;

    // 判断格式是否正确
    def format = Pattern.matches(idcard_patter,idcode);

    // 返回验证结果,校验码和格式同时正确才算是合法的身份证号码
    return last.equals(last_no) && format;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值