一、需求:密码必须是包含大写字母、小写字母、数字、特殊符号(不是字母,数字,下划线,汉字的字符)的8位以上组合

二、方案:利用正则表达式来校验

三、思路:排除法

  1、排除大写字母、小写字母、数字、特殊符号中1种组合、2种组合、3种组合,那么就只剩下4种都包含的组合了

  2、表达式为:^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$

  3、拆分解释:其中(2)-(6)运用了零宽断言、环视等正则功能

    (1)^匹配开头

    (2)(?![A-Za-z0-9]+$)匹配后面不全是(大写字母或小写字母或数字)的位置,排除了(大写字母、小写字母、数字)的1种2种3种组合

    (3)(?![a-z0-9\\W]+$)同理,排除了(小写字母、数字、特殊符号)的1种2种3种组合

    (4)(?![A-Za-z\\W]+$)同理,排除了(大写字母、小写字母、特殊符号)的1种2种3种组合

    (5)(?![A-Z0-9\\W]+$)同理,排除了(大写字母、数组、特殊符号)的1种2种3种组合

    (6)[a-zA-Z0-9\\W]匹配(小写字母或大写字母或数字或特殊符号)因为排除了上面的组合,所以就只剩下了4种都包含的组合了

    (7){8,}8位以上

    (8)$匹配字符串结尾

四、代码:

public class RegexTest {
public static final String PW_PATTERN = "^(?![A-Za-z0-9]+$)(?![a-z0-9\\W]+$)(?![A-Za-z\\W]+$)(?![A-Z0-9\\W]+$)[a-zA-Z0-9\\W]{8,}$"; public static void main(String[] args) {
String pw1 = "ABCDEFGHIG";
String pw2 = "abcdefghig";
String pw3 = "0123456789";
String pw4 = "!@#$%^&*()";
String pw5 = "ABCDEabcde";
String pw6 = "ABCDE01234";
String pw7 = "ABCDE!@#$%";
String pw8 = "abcde01234";
String pw9 = "abcde!@#$%";
String pw10 = "01234!@#$%";
String pw11 = "abcde01234!@#$%";
String pw12 = "ABCDE01234!@#$%";
String pw13 = "ABCDEabcde!@#$%";
String pw14 = "ABCDEabcde01234";
String pw15 = "Aa0!";
//符合要求密码
String pw16="ABCabc012!@#"; System.out.println(pw1.matches(PW_PATTERN));
System.out.println(pw2.matches(PW_PATTERN));
System.out.println(pw3.matches(PW_PATTERN));
System.out.println(pw4.matches(PW_PATTERN));
System.out.println(pw5.matches(PW_PATTERN));
System.out.println(pw6.matches(PW_PATTERN));
System.out.println(pw7.matches(PW_PATTERN));
System.out.println(pw8.matches(PW_PATTERN));
System.out.println(pw9.matches(PW_PATTERN));
System.out.println(pw10.matches(PW_PATTERN));
System.out.println(pw11.matches(PW_PATTERN));
System.out.println(pw12.matches(PW_PATTERN));
System.out.println(pw13.matches(PW_PATTERN));
System.out.println(pw14.matches(PW_PATTERN));
System.out.println(pw15.matches(PW_PATTERN));
System.out.println(pw16.matches(PW_PATTERN));
}
}

输出结果除最后一行外全是false,即只有最后一个密码是符合要求的

五、参考:

  1、《精通正则表达式》第三版 P59用环视功能为数值添加逗号,P129锚点及其他“零长度断言”

  2、正则表达式30分钟入门教程

java正则表达式校验密码必须是包含大小写字母、数字、特殊符号的8位以上组合的更多相关文章

  1. Java随机获取32位密码且必须包含大小写字母、数字和特殊字符,四种的任意三种

    Java随机获取32位密码且必须包含大小写字母.数字和特殊字符,四种的任意三种 Java随机获取32位密码且必须包含大小写字母.数字和特殊字符,四种的任意三种,代码如下: import java.ut ...

  2. js验证:密码只能为大写字母+小写字母+数字的8至15位字符组合

    var reg = /^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])[a-zA-Z0-9]{8,15}$/; // alert(password); if(reg.test(pa ...

  3. iOS开发-通过正则表达式进行各种判断银行卡,车牌号,邮箱地址,QQ,身份证,全字母,仅输入字母或数字同时包含大小写字母和数字,仅能输入中文等

    /* *  验证银行卡号是否正确 *  车牌号验证 *  检验邮箱地址是否正确 *  手机号中间四位密文显示 *  判断QQ号是否正确(5-11位) *  判断身份证号是否正确(如末位为字母请用“x” ...

  4. Python 使用正则表达式验证密码必须包含大小写字母和数字

    校验密码是否合法的程序. 输入一个密码 1.长度5-10位 2.密码里面必须包含,大写字母.小写字母和数字 3.最多输入5次 ===================================== ...

  5. js 正则 以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“

    js  正则  以字母开头必须有 大小写字母数字组成 可以有“@"或 ”.“ var reg = /^[a-zA-Z]{1}(?=.*[a-z])(?=.*[A-Z])[a-zA-Z\d_@ ...

  6. JAVA正则表达式校验qq号码

    /* * 校验qq号码* 要求必须是5-15位* 0不能开头* 必须都是数字 */ (1)使用正则表达式校验qq号码 (2)方式2

  7. Java正则表达式校验QQ号码和邮箱地址格式

    public class Demo02 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ...

  8. python习题-产生8位随机密码要包含大小写及数字

    # 1.写一个产生密码的程序,# 输入次数,输入多少次就产生多少条数据,# 要求密码必须包含大写字母.小写字母和数字,长度8位,不能重复 #需求分析#1.循环,输入什么就循环多少次#2.随机来取值,是 ...

  9. PHP随机生成要求位数个字符(大小写字母+数字)

    php随机生成要求位数个字符 /** * 随机生成要求位数个字符 * @param length 规定几位字符 */ function getRandChar($length){ $str = nul ...

随机推荐

  1. Python组合类型笔记

    Python中常用的三种组合数据类型,分别是: - 集合类型 - 序列类型 - 字典类型 1. 集合类型: -集合用大括号{}表示,元素间用逗号分隔 -建立集合类型用{}或set() -建立空集合类型 ...

  2. Linux内核5.4正式将华为EROFS超级文件系统合入主线

    导读 近期,Linux内核5.4系列宣布全面可用,添加了许多新功能,更强的安全性和更新的驱动程序,以提供更好的硬件支持.Linux内核5.4增加对微软exFAT文件系统的支持,另外还支持内核锁定功能, ...

  3. 34 java 文件过滤 FileFilter

    package com.da.tool.util; import org.apache.commons.io.filefilter.RegexFileFilter; import java.io.Fi ...

  4. canvas画扇形、饼图

    画扇形的方法 方法一:起始角度是0,那么第一条线就是line(r,0),通过旋转扇形的角度,第二条线就是line(r,0) //圆弧 ctx.save(); ctx.translate(100, 10 ...

  5. error C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation

    遇到这个问题,请打开项目的Properties(属性)------->Configuration Properties(配置属性)------>C/C++ ------>Prepro ...

  6. redis地理位置

    redis 3.2版本中增加的最大功能就是对GEO(地理位置)的支持 当前业务中地图方面是调用高德api(云图),请求多少会有延迟  而redsigeo可以实现查找附近的终端以及测量两点之间的直线距离 ...

  7. mysql时出现:is not allowed to connect to this MySQL serverConnection closed by foreign host问题的解决

    这个原因是因为索要链接的mysql数据库只允许其所在的服务器连接,需要在mysql服务器上设置一下允许的ip权限,如下: 1.连接mysql mysql -u root -p 1 如图: 2.授权 g ...

  8. 隧道技术(Tunneling)

    隧道技术及其应用 隧道技术(Tunneling)是一种通过使用互联网络的基础设施在网络之间传递数据的方式.使用隧道传递的数据(或负载)可以是不同协议的数据帧或包.隧道协议将其它协议的数据帧或包重新封装 ...

  9. Day4 - C - 六度分离 HDU - 1869

    1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人 ...

  10. Java 8 Stream 的终极技巧——Collectors 操作

    1. 前言 昨天在 Collection移除元素操作 相关的文章中提到了 Collectors .相信很多同学对这个比较感兴趣,那我们今天就来研究一下 Collectors . 2. Collecto ...