正则表达式
案例引入
你可能有过这样的经历:我们去某些网站注册帐号,当你在设置密码的时候,网站会提示你密码的长度范围,以及对应的规则限制(如下图)。
根据上图,我们将密码设置规则可以描述为两个条件:
(1)长度为6-16位;
(2)密码中必须包含数字,大写字母,小写字母,特殊字符(指定字符);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /** * 校验用户密码是否满足设置规则 * * @param password 用户输入的密码 * @return true-满足;false-不满足 */ public static boolean checkPassword(String password) { // 密码不能为空 if (password == null || password.isEmpty()) { return false ; } // 校验密码长度(6-16位) int len = password.length(); if (len < 6 || len > 16) { return false ; } // 定义四种组合条件 boolean hasNumber = false ; boolean hasSmallLetter = false ; boolean hasBigLetter = false ; boolean hasSpecialChar = false ; // 将密码字符串拆分为单个字符,然后对每个字符进行校验 char[] chars = password.toCharArray(); for (char c : chars) { // 是否包含数字0-9 if (c >= '0' && c <= '9' ) { hasNumber = true ; continue ; } // 是否包含小写字母a-z if (c >= 'a' && c <= 'z' ) { hasSmallLetter = true ; continue ; } // 是否包含大写字母A-Z if (c >= 'A' && c <= 'Z' ) { hasBigLetter = true ; continue ; } // 是否满足指定的特殊字符 if ( "~@#S%*_-+=:.?" .indexOf(c) > 0) { hasSpecialChar = true ; continue ; } // 如果某个字符不在上面四种情况,则不满足规则 return false ; } // 如果四种组合条件均满足,则符合密码设置规则 return hasNumber && hasSmallLetter && hasBigLetter && hasSpecialChar; } |
可以看到,我们列举的8组密码,都得到了验证,说明我们的方法是OK的。
下面,则是具有相同校验功能,基于正则表达式的验证方法:
1 2 3 4 5 6 7 8 9 | /** * 通过正则表达式校验用户密码是否满足设置规则 * * @param password 用户输入的密码 * @return true-满足;false-不满足 */ public static boolean checkPasswordByRegex(String password) { return Pattern.matches( "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~@#S%*_\\-+=:.?])[A-Za-z0-9~@#S%*_\\-+=:.?]{8,20}$" , password); } |
通过结果我们可以看到,他也是符合我们预期的。于是我们发现,在不用正则表达式的时候,我们的代码量近30行,而使用了正则表达式,代码就浓缩为了1行,也就是说,使用正则表达式时可以简化我们的代码。
正则:\d
\d 表示一个数字。
如:
aaa\d: 表示验证的字符串后面必须以 aaa 开头,且以一个数字结尾。
aaa\dbbb:aaa和bbb中间有一个数字
正则:\D
\D 表示一个非数字,它和上面 \d 的意思恰好相反。
如:
\D\D\D: 则表示一个长度为3,不包含数字的字符串。
正则:\w
\w 表示一个字母(大小写均可)、数字,或下划线。
如:
12\w45:则表示12和45中间必须是一个字母,数字,或下划线。
正则:|
| (竖线) 则表示或的关系,表示检测的字符串须满足其中一个时,才符合条件。
如:
aa|bb|cc:则表示输入的字符串须是aa,或bb,或cc其中的一个。
正则:[abc]
[ ] 表示匹配其中任意一个字符。
如:
a[bcd]e:则表示a和e的中间须是b,或c,或d其中的一个
正则:[^abc]
[^ ] 表示不与中括号里的任意字符匹配。
如:
a[^bcd]e:则表示a和e的中间除b,c,d这三个字符外,其他的字符都满足。
正则:[a-z]
[值1-值2] 则表示值1到值2中间的所有字符都满足(包括值1和值2)。常用该正则来表示大小写字母范围,数字范围。
正则:[^a-z]
[^值1-值2] 则表示除值1和值2之外的所有字符,都可以满足。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界