密码校验规则(不能包含3个及以上字典、键盘连续字符)

需求

1、长度大于8,且小于32
2、不能包含用户名
3、不能包含连续3位及以上相同字母或数字
4、不能包含3个及以上字典连续字符
4、数字、小写字母、大写字母、特殊字符,至少包含三种

package com.yy.springboottest.util;/*** @author ode* @create 2024-03-13 21:27*/
public class RegexUtil {/*** 数字*/private static final String REG_NUMBER = ".*\\d+.*";/*** 小写字母*/private static final String REG_UPPERCASE = ".*[A-Z]+.*";/*** 大写字母*/private static final String REG_LOWERCASE = ".*[a-z]+.*";/*** 特殊符号(~!@#$%^&*()_+|<>,.?/:;'[]{}\)*/private static final String REG_SYMBOL = ".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*";/*** 键盘字符表(小写)* 非shift键盘字符表*/private static final char[][] CHAR_TABLE1 = new char[][]{{'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\0'},{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', '\\'},{'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', '\'', '\0', '\0'},{'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', '\0', '\0', '\0'}};/*** shift键盘的字符表*/private static final char[][] CHAR_TABLE2 = new char[][]{{'!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '\0'},{'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '{', '}', '|'},{'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ':', '"', '\0', '\0'},{'z', 'x', 'c', 'v', 'b', 'n', 'm', '<', '>', '?', '\0', '\0', '\0'}};public static void main(String[] args) {String password = "qaz124edYY";System.out.println(checkPasswordRule(password, " "));}/*** 校验密码** @param password 密码* @param username 用户名*/public static boolean checkPasswordRule(String password, String username) {if (password == null || password.length() < 8 || password.length() > 32) {System.out.println("长度小于8,或大于32");return false;}if (password.contains(username)) {System.out.println("包含用户名");return false;}if (isContinuousChar(password)) {System.out.println("包含3个及以上相同或字典连续字符");return false;}if (isKeyBoardContinuousChar(password)) {System.out.println("包含3个及以上键盘连续字符");return false;}int i = 0;if (password.matches(REG_NUMBER)) i++;if (password.matches(REG_LOWERCASE)) i++;if (password.matches(REG_UPPERCASE)) i++;if (password.matches(REG_SYMBOL)) i++;if (i < 3) {System.out.println("数字、小写字母、大写字母、特殊字符,至少包含三种");return false;}return true;}/*** 是否包含3个及以上相同或字典连续字符*/private static boolean isContinuousChar(String password) {char[] chars = password.toCharArray();for (int i = 0; i < chars.length - 2; i++) {int n1 = chars[i];int n2 = chars[i + 1];int n3 = chars[i + 2];// 判断重复字符if (n1 == n2 && n1 == n3) {return true;}// 判断连续字符: 正序 + 倒序if ((n1 + 1 == n2 && n1 + 2 == n3) || (n1 - 1 == n2 && n1 - 2 == n3)) {return true;}}return false;}/*** 是否包含3个及以上键盘连续字符** @param password 待匹配的字符串*/private static boolean isKeyBoardContinuousChar(String password) {if (password == null) {return false;}//考虑大小写,都转换成小写字母char[] lpStrChars = password.toLowerCase().toCharArray();// 获取字符串长度int nStrLen = lpStrChars.length;// 定义位置数组:row - 行,col - column 列int[] pRowCharPos = new int[nStrLen];int[] pColCharPos = new int[nStrLen];for (int i = 0; i < nStrLen; i++) {char chLower = lpStrChars[i];pColCharPos[i] = -1;// 检索在表1中的位置,构建位置数组for (int nRowTable1Idx = 0; nRowTable1Idx < 4; nRowTable1Idx++) {for (int nColTable1Idx = 0; nColTable1Idx < 13; nColTable1Idx++) {if (chLower == CHAR_TABLE1[nRowTable1Idx][nColTable1Idx]) {pRowCharPos[i] = nRowTable1Idx;pColCharPos[i] = nColTable1Idx;}}}// 在表1中没找到,到表二中去找,找到则continueif (pColCharPos[i] >= 0) {continue;}// 检索在表2中的位置,构建位置数组for (int nRowTable2Idx = 0; nRowTable2Idx < 4; nRowTable2Idx++) {for (int nColTable2Idx = 0; nColTable2Idx < 13; nColTable2Idx++) {if (chLower == CHAR_TABLE2[nRowTable2Idx][nColTable2Idx]) {pRowCharPos[i] = nRowTable2Idx;pColCharPos[i] = nColTable2Idx;}}}}// 匹配坐标连线for (int j = 1; j <= nStrLen - 2; j++) {//同一行if (pRowCharPos[j - 1] == pRowCharPos[j] && pRowCharPos[j] == pRowCharPos[j + 1]) {// 键盘行正向连续(asd)或者键盘行反向连续(dsa)if ((pColCharPos[j - 1] + 1 == pColCharPos[j] && pColCharPos[j] + 1 == pColCharPos[j + 1]) ||(pColCharPos[j + 1] + 1 == pColCharPos[j] && pColCharPos[j] + 1 == pColCharPos[j - 1])) {return true;}}//同一列if (pColCharPos[j - 1] == pColCharPos[j] && pColCharPos[j] == pColCharPos[j + 1]) {//键盘列连续(qaz)或者键盘列反向连续(zaq)if ((pRowCharPos[j - 1] + 1 == pRowCharPos[j] && pRowCharPos[j] + 1 == pRowCharPos[j + 1]) ||(pRowCharPos[j - 1] - 1 == pRowCharPos[j] && pRowCharPos[j] - 1 == pRowCharPos[j + 1])) {return true;}}}return false;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端请求到 SpringMVC 的处理流程

1. 发起请求 客户端通过 HTTP 协议向服务器发起请求。 2. 前端控制器&#xff08;DispatcherServlet&#xff09; 这个请求会先到前端控制器 DispatcherServlet&#xff0c;它是整个流程的入口点&#xff0c;负责接收请求并将其分发给相应的处理器。 3. 处理器映射&#xf…

物体检测-系列教程24:YOLOV5 源码解析14 (训练过程解读:训练配置文件、训练脚本train.py)

&#x1f60e;&#x1f60e;&#x1f60e;物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 18、训练配置文件 位置yolov5/data文件夹/hyp.scratch.yaml文件 文件内容&#xff1a; …

SpringBoot项目中出现不同端口跨域问题,如何解决?

方法一&#xff1a;比较繁琐&#xff0c;适合少量Controller控制器类 方法二 &#xff1a;需要写一个全局的配置文件即可 在如图所示的common目录下新建一个CorsConfig的class文件 具体代码展示&#xff1a; import org.springframework.context.annotation.Bean; import o…

前端Vue列表组件 list组件:实现高效数据展示与交互

前端Vue列表组件 list组件&#xff1a;实现高效数据展示与交互 摘要&#xff1a;在前端开发中&#xff0c;列表组件是展示数据的重要手段。本文将介绍如何使用Vue.js构建一个高效、可复用的列表组件&#xff0c;并探讨其在实际项目中的应用。 效果图如下&#xff1a; 一、引言…

功能测试--APP性能测试

功能测试--APP性能测试 内存数据查看内存测试 CPU数据查看CPU测试 流量和电量的消耗流量测试流量优化方法电量测试电量测试场景&#xff08;大&#xff09; 获取启动时间启动测试--安卓 流畅度流畅度测试 稳定性稳定性测试 内存数据查看 内存泄露:内存的曲线持续增长(增的远比减…

git上拉下来的web项目,只有一个.git路径解决

代码拉下来的时候&#xff0c;web项目路径只有一个.git&#xff0c;可能指没有致命分支&#xff1a; 用idea打开web项目&#xff1b;切换到对应的分支即可

基于Ambari搭建大数据分析平台

一、部署工具简介 1. Hadoop生态系统 Hadoop big data ecosystem in Apache stack 2. Hadoop的发行版本 Hadoop的发行版除了Apache的开源版本之外&#xff0c;国外比较流行的还有&#xff1a;Cloudera发行版(CDH)、Hortonworks发行版&#xff08;HDP&#xff09;、MapR等&am…

Vuex和Pinia

Vuex概述 vuex是一个vue的状态管理工具&#xff0c;状态就是数据&#xff08;多组件共享数据&#xff09;。 优势&#xff1a; 共同维护一份数据&#xff0c;数据集中化管理响应式变化操作简洁&#xff08;vuex提供了一些辅助函数&#xff09; vuex的使用 安装vuex插件 y…

代理IP是否会导致网络连接变慢?

目录 一、代理IP的工作原理及其在网络中的作用 二、代理IP可能导致网络连接变慢的因素 三、案例分析 四、优化代理IP使用的建议 五、总结 在网络世界中&#xff0c;代理IP的使用非常普遍&#xff0c;尤其是在需要隐藏真实IP地址、访问受限资源或进行网络爬虫等场景下。然而…

4. Linux文件属性和目录系列

在 Linux 系统中,文件和目录是基本的文件系统组成部分。文件系统是用于组织和存储文件的一种结构,而文件和目录则是文件系统的核心元素。以下是对 Linux 文件和目录的详细解释: 1. 文件(File) 在 Linux 中,文件是数据的集合,可以是文本文件、二进制文件、设备文件等。…

1362:家庭问题(family)

【算法分析】 搜索 从每个顶点尝试开始搜索&#xff0c;如果成功开始进行一次搜索&#xff0c;即可标记整个连通分量。成功开始搜索的次数即为连通分量的个数。搜索过程中对这一趟搜索到的顶点做计数&#xff0c;能达到在最大计数即为顶点数量最多的连通分量的顶点数。…

如何查看mnist数据集的图片

import numpy as np import matplotlib.pyplot as pltdef read_mnist_images(filename):with open(filename, rb) as f:# 读取魔术数字、图像数量、行数、列数magic_number int.from_bytes(f.read(4), big)number_of_images int.from_bytes(f.read(4), big)rows int.from_by…

UE4案例记录

UE4案例记录&#xff08;制作3D角色显示在UI中&#xff09; 制作3D角色显示在UI中 转载自youtube视频 https://www.youtube.com/channel/UCC8f6SxKJElVvaRb7nF4Axg 新建项目 创建一个Actor 场景组件->摄像机组件->场景捕获组件2D&#xff0c;之后添加一个骨骼网格体…

CLion 配置 Qt 开发环境

文章目录 CLion 配置 Qt 开发环境环境说明基本配置1. 创建Qt项目2. 设置CLion工具链3. 配置外部工具 一些问题的补充 CLion 配置 Qt 开发环境 环境说明 操作系统&#xff1a;Windows 10 CLion版本&#xff1a;2023.3.4 CMake版本&#xff1a;3.27.7 Qt6版本&#xff1a;6.6…

Java特性之设计模式【组合模式】

一、组合模式 概述 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#x…

AHU 汇编 实验一

一、实验名称&#xff1a;实验1 实验1 用Debug命令查看寄存器和内存中的内容 实验目的:求掌握使用Debug命令查看寄存器和内存的方法。 通过第2章两个简单实例认识汇编语言程序&#xff0c;初步了解程序格式&#xff1b;段定义&#xff1b;标号&#xff1b;DOS系统功能&#xf…

基于恒功率PQ控制的三电平并网逆变器MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 三相 T 型三电平逆变器电路如图所示&#xff0c;逆变器主回路由三个单相 T 型逆变器组成。 直流侧输入电压为 UPV&#xff0c;直流侧中点电位 O 设为零电位&#xff0c;交流侧输出侧是三相三线制连…

如何深度学习

信息爆炸时代&#xff0c;诞生了很多新的学习方式&#xff0c;非常轻松就能掌握知识&#xff0c;比如&#xff0c;每天听一本书&#xff0c;半个小时就能学习一本书的精华&#xff0c;比如订阅名家专栏或者课程&#xff0c;在不长的时间内内就能学到很多知识。 很多人认为这样…

ADC不同类型以及原理

对逐次逼近型&#xff08;SAR&#xff09;的理解&#xff1a; 对于我们做技术的而言&#xff0c;用查表法来通俗解释更合适。只是为了提高查表的速度&#xff0c;这个表格不是我们常规的计算温度的时候&#xff0c;表头温度下限&#xff0c;表尾温度上限&#xff0c;而是一上来…

SkiROS2:技能型机器人控制平台的探索之旅

文章目录 引言背景介绍SkiROS2架构实际使用案例1. 在仓库中执行物品搬运任务技能定义行为树构建代码实现 2. 家庭服务机器人技能定义行为树构建代码实现 展望&#xff1a;SkiROS2与大模型技术的结合融合大模型的决策制定情境感知与自适应技能持续学习与技能改进挑战与机遇 结论…