正则表达式--密码复杂度验证--必须包含大写、小写、数字、特殊字符中的至少三项

简介: 正则表达式--密码复杂度验证--必须包含大写、小写、数字、特殊字符中的至少三项

密码复杂度要求:


大写字母、小写字母、数字、特殊字符,四项中至少包含三项。


import org.junit.Test;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @Author TeacherFu
 * @Version 1.0
 */
public class PasswordTest {
/**
     * 1.全部包含:大写、小写、数字、特殊字符;
     * 2.无大写:小写、数字、特殊字符;
     * 3.无小写:大写、数字、特殊字符;
     * 4.无数字:大写、小写、特殊字符;
     * 5.无特殊字符:大写、小写、数字;
     */
    @Test
    public void complexTest(){
        List<String> list = Arrays.asList(new String[]{
                //全包含
                "aBcd12@",
                "aB2@dfgh",
                "aB2_dfgh",
                "123Abc_",
                "_123Abc",
                "~123Abc",
                //无大写
                "abcd12@",
                "!abcd12",
                "(abcd12",
                ")abcd12",
                "{abcd12",
                "}abcd12",
                "[abcd12",
                "]abcd12",
                "|abcd12",
                "\\abcd12",
                "\"abcd12",
                "'abcd12",
                ":abcd12",
                "?abcd12",
                "<abcd12",
                ">abcd12",
                "~abcd12",
                "3~bcd12",
                "F~bcd12",
                //无小写
                "ABCD12@",
                "!ABCD12",
                "!AB12333",
                //无数字
                "aBcd_@",
                "!Abcd",
                //无特殊字符
                "abCd12",
                "abcD12",
                "12345678",
                "abcdefgh",
                "ABCDEFGH",
                "abcd1234",
                "ABCD1234",
                //无特殊字符
                "aBcd1234",
                //无数字
                "abcdEfgh!",
                "~!@#$%^&*()_+{}:'?<>",
                "abcd!@#$",
                "1234!@#$",
                "",
                null
        });
        List<String> matches = new ArrayList<String>();
        for(String word : list){
            //
            if(isComplexityMatches(word)) {
                matches.add(word);
            }
        }
        System.out.println(Arrays.toString(matches.toArray()));
        List<String> matches2 = new ArrayList<String>();
        for(String word : list){
            //
            if(isComplexityMatches2(word)) {
                matches2.add(word);
            }
        }
        System.out.println(Arrays.toString(matches2.toArray()));
        List<String> matches3 = new ArrayList<String>();
        for(String word : list){
            //
            if(isComplexityMatches3(word,5,6)) {
                matches3.add(word);
            }
        }
        System.out.println(Arrays.toString(matches3.toArray()));
    }
    /**
     * 复杂度要求:
     * 大写、小写、数字、特殊字符,需要包含其中至少三项
     *
     * @param content
     * @return
     */
    private boolean isComplexityMatches(String content){
        if(!StringUtils.hasLength(content)){
            return false;
        }
        //1.全部包含:大写、小写、数字、特殊字符;
        String regex1 = "(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[\\W_])^.*$";
        //2.无大写:小写、数字、特殊字符;
        String regex2 = "(?=.*[a-z])(?=.*[0-9])(?=.*[\\W_])^.*$";
        //3.无小写:大写、数字、特殊字符;
        String regex3 = "(?=.*[A-Z])(?=.*[0-9])(?=.*[\\W_])^.*$";
        //4.无数字:大写、小写、特殊字符;
        String regex4 = "(?=.*[A-Z])(?=.*[a-z])(?=.*[\\W_])^.*$";
        //5.无特殊字符:大写、小写、数字;
        String regex5 = "(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])^.*$";
        String regex = "(" + regex1 + ")|(" + regex2 + ")|(" + regex3 + ")|(" + regex4 + ")|(" + regex5 + ")";
        return content.matches(regex);
    }
    private boolean isComplexityMatches2(String content){
        if(!StringUtils.hasLength(content)){
            return false;
        }
        //String regex = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{8,30}$";
        //String regex = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{8,30}$";
        //String regex = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{5,30}$";
        //String regex = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[a-zA-Z0-9\\W_]{5,}$";
        String regex = "^(?![A-Za-z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[A-Za-z0-9\\W_]{5,}$";//ok
        //String regex = "(?![A-Za-z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)^[A-Za-z0-9\\W_]{5,}$";//ok
        //String regex = "^[A-Za-z0-9\\W_]{5,}$(?![A-Za-z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)";
        //错误的模式,测试结果不正确(此模式匹配的是:大写、小写、数字、特殊字符等四项必须全部包含)
        String regex2 = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{5,30}$";
        return content.matches(regex);
        //return content.matches(regex2);
    }
    private boolean isComplexityMatches3(String content,Integer minLength,Integer maxLength){
        if(!StringUtils.hasLength(content)){
            return false;
        }
        if(minLength != null && maxLength != null && minLength > maxLength){
            System.out.println("参数非法:最小长度不能大于最大长度。");
            return false;
        }
        if(minLength == null && maxLength != null && maxLength < 0){
            System.out.println("参数非法:最大长度不能小于0。");
            return false;
        }
        String length = "";
        if(minLength == null || minLength < 1){
            length = "{0,";
        }else{
            length = "{" + minLength + ",";
        }
        if(maxLength == null){
            length = length + "}";
        }else {
            length = length + maxLength + "}";
        }
        //String regex = "^(?![A-Za-z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[A-Za-z0-9\\W_]{5,}$";//ok
        String regex = "^(?![A-Za-z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_]+$)(?![a-z0-9]+$)(?![a-z\\W_]+$)(?![0-9\\W_]+$)[A-Za-z0-9\\W_]" + length + "$";
        return content.matches(regex);
    }
}



相关文章
|
17天前
|
网络协议 JavaScript 前端开发
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名2
使用正则表达式验证身份证号、QQ号、手机号、邮箱、地址、邮编、银行卡号、学号、车牌号、快递单号、验证码、ISBN号、网址、IPV4地址、IPV6地址、出生年月日、姓名
227 0
|
1月前
|
Java
38、Java 中的正则表达式(单字符匹配和预定义字符)
38、Java 中的正则表达式(单字符匹配和预定义字符)
18 0
|
8月前
正则表达式中的字符详解
正则表达式中的字符详解
62 1
|
3月前
|
JavaScript 数据安全/隐私保护
jquery正则表达式验证手机号密码和姓名字段
jquery正则表达式验证手机号密码和姓名字段
|
4月前
|
人工智能 JavaScript
js正则表达式new RegExp(表达式, “gi“)不区分大小写、忽略大小写匹配替换字符
js正则表达式new RegExp(表达式, “gi“)不区分大小写、忽略大小写匹配替换字符
【正则表达式】正则表达式同时支持验证手机号码和座机号码
【正则表达式】正则表达式同时支持验证手机号码和座机号码
|
4月前
|
数据采集 Java API
Java 正则表达式【非贪婪匹配、格式验证、反向引用、API】
Java 正则表达式【非贪婪匹配、格式验证、反向引用、API】
|
5月前
|
JavaScript
正则表达式同时验证手机和座机号码
正则表达式同时验证手机和座机号码
93 0
|
5月前
|
Python
132 python高级 - 正则表达式(表示字符)
132 python高级 - 正则表达式(表示字符)
48 0
|
8月前
|
Shell
shell中正则表达式中字符的应用具体实例以及详解
shell中正则表达式中字符的应用具体实例以及详解
94 3