经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
正则表达式之密码验证
来源:cnblogs  作者:日月疆  时间:2018/10/23 9:28:47  对本文有异议

对于门户网站,用户注册或修改密码时,需要有正则表达式验证密码,根据安全级别不同,网站会设置不同基本的密码正则表达式。
而此文主要通过一个实例,来讲解密码正则表达式中使用的特殊正则语法,如?! 、?= 等(Java代码验证)。

密码强度要求

  1. 至少包含一个数字,一个字母,一个特殊字符
  2. 密码长度在8~18之间

特殊正则语法

  1. Java 8 API中Pattern类对特殊正则语法的描述
  2. 正则字符详细说明
字符 说明
* 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
+ 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。
? 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。
. 匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。
(?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95
(?!pattern) 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95

密码正则表达式

  1. 正向断言: regex = ^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$_&*+-])[0-9a-zA-Z!@#$_&*+-]{8,18}$
    解释:根据上面的正则字符说明,先分析(?=.*[0-9]), 其中?=pattern01是正向先行搜索子表达,不获取匹配,其实可以理解为断言匹配的string能够用pattern01匹配到子表达,如果断言成功,则就用剩下剩余的regex去匹配此string,否则regex即匹配不成功;
    .*[0-9]表示匹配以数字结尾的字符串(即整个待匹配的字符串包含数字),所以(?=.*[0-9])表示为断言字符串包含数字,(?=.*[a-zA-Z])断言字符串包含字母,(?=.*[!@#$_&*+-])断言字符创包含特殊字符;若这三个断言成功,就限定了string至少含有数字、字母、特殊字符;
    而最后的[0-9a-zA-Z!@#$_&*+-]就限定了只能包含数字、字母、特殊字符。
  2. 反向断言: regex = ^(?![a-zA-Z0-9]+$)(?![a-zA-Z!@#$%^_&*]+$)(?![0-9!@#$%^_&*]+$)[a-zA-Z0-9!@#$%^_&*]{8,18}$
    解释:(?![a-zA-Z0-9]+$)表示不能只包含数字和字母,同理,三个反向断言也可以限定至少包含一个数字、字母、特殊字符

代码测试

  1. public class HelloWorld {
  2. public static void main(String []args) {
  3. // testRegexPositive();
  4. testRegexNegative();
  5. }
  6. public static void testRegexPositive() {
  7. System.out.println("=====testRegexPositive====");
  8. String reg = "^(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[!@#$_&*+-])[0-9a-zA-Z!@#$_&*+-]{8,18}$";
  9. Pattern pattern = Pattern.compile(reg);
  10. Scanner sc = new Scanner(System.in);
  11. while( sc.hasNext() ) {
  12. String str = sc.nextLine();
  13. Matcher matcher = pattern.matcher(str);
  14. if ( matcher.matches() ) {
  15. System.out.println( str + " matched! length = " + String.valueOf(str.length()) );
  16. } else {
  17. System.out.println( str + " not matched! length = " + String.valueOf(str.length()) );
  18. }
  19. }
  20. }
  21. public static void testRegexNegative() {
  22. System.out.println("=====testNegative====");
  23. String reg = "^(?![a-zA-Z0-9]+$)(?![a-zA-Z!@#$%^_&*]+$)(?![0-9!@#$%^_&*]+$)[a-zA-Z0-9!@#$%^_&*]{8,18}$";
  24. Pattern pattern = Pattern.compile(reg);
  25. Scanner sc = new Scanner(System.in);
  26. while( sc.hasNext() ) {
  27. String str = sc.nextLine();
  28. Matcher matcher = pattern.matcher(str);
  29. if ( matcher.matches() ) {
  30. System.out.println( str + " matched! length = " + String.valueOf(str.length()) );
  31. } else {
  32. System.out.println( str + " not matched! length = " + String.valueOf(str.length()) );
  33. }
  34. }
  35. }
  36. }
  1. 正向测试结果
  1. =====testRegexPositive====
  2. 1234asdf
  3. 1234asdf not matched! length = 8
  4. asdf@w1
  5. asdf@w1 not matched! length = 7
  6. asdf@w12
  7. asdf@w12 matched! length = 8
  1. 反向测试结果
  1. =====testNegative====
  2. 1234asdf
  3. 1234asdf not matched! length = 8
  4. 1234asd
  5. 1234asd not matched! length = 7
  6. 1234asd#
  7. 1234asd# matched! length = 8
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号