Java正则校验密码至少包含字母数字特殊符号中的2种实例代码

 更新时间:2022年08月02日 10:50:35   作者:CoreCmd  
正则表达式验证密码功能在项目中经常被使用到,但是很多朋友还是不大会使用密码正则表达式进行验证,下面这篇文章主要给大家介绍了关于Java正则校验密码至少包含字母数字特殊符号中2种的相关资料,需要的朋友可以参考下

一、语法

字符说明
\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n\n 匹配换行符。序列 \\\\ 匹配 \\\\( 匹配 (
^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。
$匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。
*零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
+一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。
?零次或一次匹配前面的字符或子表达式。例如,"do(es)?“匹配"do"或"does"中的"do”。? 等效于 {0,1}。
{n}_n _是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。
{n,}_n _是非负整数。至少匹配 _n _次。例如,"o{2,}“不匹配"Bob"中的"o”,而匹配"foooood"中的所有 o。"o{1,}“等效于"o+”。"o{0,}“等效于"o*”。
{n,m}m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。‘o{0,1}’ 等效于 ‘o?’。注意:您不能将空格插入逗号和数字之间。
?当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?“只匹配单个"o”,而"o+“匹配所有"o”。

二、正则实战

1、纯字母

"[a-zA-Z]{1,}$"

2、纯数字

"[0-9]{1,}$"

3、字母和数字组合

"((^[a-zA-Z]{1,}[0-9]{1,}[a-zA-Z0-9]*)+)|((^[0-9]{1,}[a-zA-Z]{1,}[a-zA-Z0-9]*)+)$"

4、字母或数字

"[a-zA-Z0-9]+$"

5、字母、数字、下划线,都可以

"\\w+$"

6、字母、数字、特殊符号,至少匹配2种

/**
     * 假定设置密码时,密码规则为:  字母、数字、特殊符号,至少匹配2种
     * 则密码可能出现的情况有:
     * 1、数字+特殊符号
     * 2、字母+特殊符号
     * 3、字母+数字
     * 4、字母+数字+特殊符号
     * (组合与顺序无关)
     * 解决思路:
     * 1、遍历字符串的字符数组,查看是否包含目标特殊字符,若包含,则标记字符串
     * 包含特殊字符,并替换当前特殊字符为''。
     * 2、判断剩下的字符组成的字符串,是否匹配以下情况
     * - 纯字母
     * - 纯数字
     * - 字母+数字
     * 3、字符串匹配规则
     * 纯字母+包含特殊字符  ---- 匹配通过
     * 纯数字+包含特殊字符 ---- 匹配通过
     * 字母+数字+包含个数字符 ---- 匹配通过
     */
    //特殊字符
    public static final String SPEC_CHARACTERS = " !\"#$%&'()*+,-./:;<=>?@\\]\\[^_`{|}~";
    // 纯字母
    public static final String character = "[a-zA-Z]{1,}$";
    // 纯数字
    public static final String numberic = "[0-9]{1,}$";
    // 字母和数字
    public static final String number_and_character = "((^[a-zA-Z]{1,}[0-9]{1,}[a-zA-Z0-9]*)+)" +
            "|((^[0-9]{1,}[a-zA-Z]{1,}[a-zA-Z0-9]*)+)$";
    // 字母或数字
    public static final String number_or_character = "[a-zA-Z0-9]+$";
    // 字母数字下划线
    public static final String ncw = "\\w+$";

    public static boolean checkPassword(String targetString) {
        String opStr = targetString;
        boolean isLegal = false;
        boolean hasSpecChar = false;
        char[] charArray = opStr.toCharArray();
        for (char c : charArray) {
            if (SPEC_CHARACTERS.contains(String.valueOf(c))) {
                hasSpecChar = true;
                // 替换此字符串
                opStr = opStr.replace(c, ' ');
            }
        }
        String excSpecCharStr = opStr.replace(" ", "");
        boolean isPureNum = Pattern.compile(numberic).matcher(excSpecCharStr).matches();
        boolean isPureChar = Pattern.compile(character).matcher(excSpecCharStr).matches();
        boolean isNumAndChar = Pattern.compile(number_and_character).matcher(excSpecCharStr).matches();
        isLegal = ((isPureNum && hasSpecChar)
                || (isPureChar && hasSpecChar) || isNumAndChar && hasSpecChar) || isNumAndChar;
        System.out.println("字符串:" + targetString + ",是否符合规则:" + isLegal);
        System.out.println("---------------");
        return isLegal;
    }

    public static void main(String[] args) {
        checkPassword("fasdagd");
        checkPassword("41234123");
        checkPassword("#$%^&&*(");
        checkPassword("fasd$$");
        checkPassword("41234%%%");
        checkPassword("fasd41^(324");
        checkPassword("fa413%^&*");
        checkPassword("&%fa413%^&*");
    }

测试结果:

附:密码中允许出现数字、大写字母、小写字母,但至少包含其中2种且长度在8-16之间(三种符号任取其二)

  • 包含三种符号中的一种符号,无效。
  • 包含三种符号中的二种符号,有效。
  • 包含三种符号中的三种符号,有效。

正向否定方式:

^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$
  • (?![\d]+$):正向否定查找。匹配向后直到结尾均为数字的字符。
  • ^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$):匹配向后直到结尾既不是纯数字,又不是纯消息字母,又不是纯大写字母的开始字符。
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefgh"));
false
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefgH"));
true
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefg8"));
true
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("abcdefG8"));
true
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("12345678"));
false
console> console.log(/^(?![\d]+$)(?![a-z]+$)(?![A-Z]+$)[\da-zA-z]{8,16}$/g.test("12345678a"));
true

这个表达式也可以实现相同的功能

^(?!^(\d+|[a-z]+|[A-Z]+)$)[\da-zA-Z]{8,16}$
  • ^(\d+|[a-z]+|[A-Z]+)$:从头到尾要么是纯数字,要么是纯小写字母,要么是纯大写字母。
  • ^(?!^(\d+|[a-z]+|[A-Z]+)$):匹配向后直到结尾既不是纯数字,又不是纯消息字母,又不是纯大写字母的开始字符。

总结 

到此这篇关于Java正则校验密码至少包含字母数字特殊符号中的2种的文章就介绍到这了,更多相关Java正则校验密码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java微信公众号开发(搭建本地测试环境)

    java微信公众号开发(搭建本地测试环境)

    这篇文章主要介绍了java微信公众号开发,主要内容有测试公众号与本地测试环境搭建,需要的朋友可以参考下
    2015-12-12
  • Java实现查找文件和替换文件内容

    Java实现查找文件和替换文件内容

    这篇文章主要为大家详细介绍了Java语言如何实现查找文件和替换文件内容功能,文中的示例代码讲解详细,感兴趣的可以跟随小编一起学习一下
    2022-08-08
  • Java中Https发送POST请求[亲测可用]

    Java中Https发送POST请求[亲测可用]

    这篇文章主要介绍了Java中Https发送POST请求[亲测可用],本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java与Node.js利用AES加密解密出相同结果的方法示例

    Java与Node.js利用AES加密解密出相同结果的方法示例

    这篇文章主要介绍了Java与Node.js利用AES加密解密出相同结果的方法,文中给出了详细的示例代码,相信对大家的学习或者工作能带来一定的帮助,需要的朋友们下面来一起看看吧。
    2017-02-02
  • Java程序包不存在的3种解决方法总结

    Java程序包不存在的3种解决方法总结

    包存在的,但是启动项目的时候提示包不存在,所以解决下,这篇文章主要给大家介绍了关于Java程序包不存在的3种解决方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • 基于@AllArgsConstructor与@Value共用的问题解决

    基于@AllArgsConstructor与@Value共用的问题解决

    这篇文章主要介绍了基于@AllArgsConstructor与@Value共用的问题解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java关键字final使用方法详解

    java关键字final使用方法详解

    在程序设计中,我们有时可能希望某些数据是不能够改变的,这个时候final就有用武之地了。final是java的关键字,本文就详细说明一下他的使用方法
    2013-11-11
  • java中ThreadLocal的基本原理

    java中ThreadLocal的基本原理

    本文讲解了java中ThreadLocal的一些基本原理,文中关于ThreadLocal的原理讲解的非常详细,感兴趣的朋友一起看看吧
    2021-08-08
  • 详解如何使用MongoDB+Springboot实现分布式ID的方法

    详解如何使用MongoDB+Springboot实现分布式ID的方法

    这篇文章主要介绍了详解如何使用MongoDB+Springboot实现分布式ID的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • FasfDFS整合Java实现文件上传下载功能实例详解

    FasfDFS整合Java实现文件上传下载功能实例详解

    这篇文章主要介绍了FasfDFS整合Java实现文件上传下载功能实例详解,需要的朋友可以参考下
    2017-08-08

最新评论