js实现一个表单输入验证,重复字符验证

2023-11-16

logon password check

加班到现在, 还是得发个 csdn

本文主要通过一个案例介绍两个东西

  1. 正则表达式中 必须含有某类字符的时候对应的 正则写法(在我之前的正则文章中已经写过了)
  2. 重复字符以及连续字符的判断方式

正则来表示验证的字符串中必须含有某类字符

重复字符以及连续字符的检测

我们要求 password 中不能含有 类似于: 'abc' 'bca' '111' '222' '333' '123' 'aaa' 这种 重复字符和连续字符。

方案1: 全部正则思想

这是学习正则的一种误区: 正则无敌,处处用正则

使用正则检测重复字符
var str = '111';
var reg = /(\w)\1\1/;
reg.test(str);
使用正则检测连续字符

不会写(理论上通过 /123|234|
456.../
应该也能写出来吧)

方案2: 使用 unicode 的编码

通过字符之间的 编码顺序来判断 是否是连续字符 或者 编码相同来判断是否是重复字符

/**
 * 如果是连字符 或者 重复字符返回 false
 * 否则返回 true
*/
function judgeChar (str) {
    str = str.replace(/s+|s+/g,'');
    var _1, _2, _3;
    for (var i = 0; i < str.length-2 ; i++) {
        _1 = str.charCodeAt(i);
        _2 = str.charCodeAt(i+1);
        _3 = str.charCodeAt(i+2);
        // 判断连续字符: 正序 + 倒序
        if ((_1 + 1 === _2 && _2 + 1 ===_3 ) || (_1 - 1 === _2 && _2 - 1 === _3)) {
            return false;
        }

        // 判断重复字符
        if (_1 === _2 && _1 === _3 ) {
            return false;
        }
    } 
    return true;
}

具体的案例实现过程

案例需求

密码检测要求: 包含数字、小写字母、大写字母、特殊字符(_$@),其中至少包含 3 种字符,至少包含8位字符, 不能含有重复字符或者 连续字符(如: 111,aaa,123,abc)

面对案例的分析

首先面对验证的问题,首要想的是 正则表达式, 而真正在进行判断的时候,我们通常会正则表达式配合其他的字符串方法来使用

我一般采取是切分验证,每个小需求分开来验证。

  1. 找出其中可以使用这个来 验证的
  2. 不容易使用正则验证的 使用其他方法来实现
  3. 正则和字符串方法都可以使用的 那就考虑那种好些
分析题目要求:

0.不能含有其他类型字符
1.8 位字符 ,可以使用字符串长度,也可以使用正则

2.重复字符, 连续字符: 使用非正则手段

3.4种字符中选取 至少选取三种字符: 使用正则来实现

  • 正面枚举字符分配的种类【C(3,4)+ C(4,4) = A(3,4)/3! + 1 = 4 * 3 * 2 / (3 * 2 * 1) + 1 = 5 种】

    • 大写字母 + 小写字母 + 数字: (?=.*[A-Z])(?=.*[a-z])(?=.*\d)
    • 大写字母 + 小写字母 + 特殊字符: (?=*[A-z])(?=*[a-z])(?=.*[_$@])
    • 大写字母 + 数字 + 特殊字符: (?=.*[A-Z])(?=.*\d)(?=.*[_$@])
    • 小写字母 + 数字 + 特殊字符: (?=.*[a-z])(?=.*\d)(?=.*[_$@])

    • 大写字母 + 小写字母 + 数字 + 特殊字符: (?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[_$@])

  • 反面 枚举字符分配种类的时候( 10 种)

    • 2 个字符: C(2,4) = 4 * 3 /2 = 6
    • 1 个字符: C(1,4) = 4

案例代码

function checkPwd (str) {
    str = str.replace(/s+|s+/g, '');
    var reg2 = /[^A-z\d_$@]/;
    if (reg2.test(str)) {
        alert('不能含有非法字符!');
        return false;
    }
    // 8 位
    if (str.length < 8) {
        alert('密码长度小于 8 位');
        return false;
    }

    // 重复连续字符
    if (!checkRepeatChar(str)) {
        alert('含有重复或者连续字符!');
        return false;
    } 

    // 至少 3 种字符
    var reg1 = /(?=.*[A-Z])(?=.*[a-z])(?=.*\d)|(?=.*[A-z])(?=.*[a-z])(?=.*[_$@])|(?=.*[A-Z])(?=.*\d)(?=.*[_$@])|(?=.*[a-z])(?=.*\d)(?=.*[_$@])/;
    if (!reg.test(str)) {
        alert('至少含有三种字符');
        return false;
    }

    return true;
    function checkRepeatChar (str) {
        var _1, _2, _3;
        for (var i = 0; i < str.length-2 ; i++) {
            _1 = str.charCodeAt(i);
            _2 = str.charCodeAt(i+1);
            _3 = str.charCodeAt(i+2);
            // 判断连续字符: 正序 + 倒序
            if ((_1 + 1 === _2 && _2 + 1 ===_3 ) || (_1 - 1 === _2 && _2 - 1 === _3)) {
                return false;
            }

            // 判断重复字符
            if (_1 === _2 && _1 === _3 ) {
                return false;
            }
        } 
        return true;
    }
}

// 测试数据
checkPwd('12323EQEdf$#!@#');// 含有非法字符
checkPwd('qw23Q'); // false 长度不够
checkPwd('123qeR_sdf'); // false 连续字符
checkPwd('qqq12Jla@'); // false  重复
checkPwd('712adFsdf'); // true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js实现一个表单输入验证,重复字符验证 的相关文章

随机推荐

  • linux16.04 从零开始搭建maskrcnn (!!亲测有效!!)

    文章参考 https github com pytorch vision blob temp tutorial tutorials torchvision finetuning instance segmentation ipynb 环境搭
  • STL源码分析:空间配置器浅析

    目录 allocator alloc 一级配置器 二级配置器 自由链表 内存分配allocate S refill函数 S chunk alloc函数 内存释放deallocate 为什么要使用free list 为什么free list要
  • Java-spring数据库编程(idea)实现学生账号登录以及管理员增删改查功能

    通过所学的Spring数据库编程知识 实现学生管理系统的登录及增删改查的功能 要求学生在控制台输入用户名密码 如果用户账号密码正确则显示登录成功 如果登录失败则显示登录失败 登录成功后 可以进行增删改的功能 思路分析 根据学生管理系统及其登
  • 【数据结构详细学习笔记2】单链表的定义和表示

    目录 1 单链表基础知识 1 1线性表链式存储结构的特点 1 2 与链式存储有关的术语 1 3链表的类型 1 4表示空表 1 5设置头结点的好处 2 单链表代码实现 附源码 3 实现单链表遇到问题 1 单链表基础知识 1 1线性表链式存储结
  • matlab 算法集锦

    算法集锦 决策树 划分点 function n h huafendian1 x n返回增益 h返回划分点 假设0代表第一类 假设1代表第二类 输入x第一列为属性 第二列为用于学习的分类结果 m sort x 1 按小到大排序 x x m t
  • Guava 之 Multimap

    Multimap 是 guava 包下的一个接口 是一个 key collection 类型的集合 Multimap 接口方法 GwtCompatible public interface Multimap
  • Git rebase变基操作

    先讲个例子理解一下什么是变基 A B C dev D E F G master 两个分支master dev 其中dev分支是在master分支上的提交点E拉出的分支 在两个分支合并之前 master分支有了新的提交F G 此时想在gitl
  • C的泛型编程

    C的泛型编程 C语言支持泛型编程吗 Generic关键字 泛型算法 C99的tgmath h void 指针 总结 泛型编程 generic programming 是程序设计语言的一种风格或范式 泛型允许程序员在强类型程序设计语言中编写代
  • RocketMQ经典高频面试题大全(附答案)

    编程界的小学生 0 彩蛋 1 说说你们公司线上生产环境用的是什么消息中间件 2 多个mq如何选型 3 为什么要使用MQ 4 RocketMQ由哪些角色组成 每个角色作用和特点是什么 5 RocketMQ中的Topic和JMS的queue有什
  • AQS(AbstractQueuedSynchronizer)阻塞队列

    AQS 队列同步器是用来构建锁或其他同步组件的基础框架 它使用一个 volatile int state 变量作为共享资源 如果线程获取资源失败 则进入同步队列等待 如果获取成功就执行临界区代码 释放资源时会通知同步队列中的等待线程 同步器
  • PyTorch YOLOv8入门解读与Python实现

    PyTorch YOLOv8入门解读与Python实现 YOLOv8是一种基于PyTorch框架实现的目标检测算法 它能够快速准确地检测图像中的多个目标 本文将详细解读YOLOv8的原理 并提供相应的Python代码实现 YOLOv8简介
  • Oracle--初学小白基础篇(第一版)

    文章目录 一 Oracle11g介绍 1 Oracle11g安装和卸载 Oracle11g安装 Oracle11g卸载 1 使用Oracle Universal Installer管理工具卸载 2 使用 deinstall bat 批处理文
  • Redis事务、持久化、发布订阅

    文章目录 Redis事务 Redis持久化 RDB Redis DataBase 快照方式 AOF Append Only File 日志形式 Redis发布订阅 发布订阅模型 实例 Redis发布订阅命令 原理 Redis事务 Redis
  • flutter 字符串的常用属性及方法

    1 字符串长度 var str 字符串的长度 print 打印 str length 打印 6 var str1 hello dart print 打印 str1 length 打印 10 2 是否为空 str isEmpty为空true
  • 关于ElasticSearch的Update By Query的那些著名的坑

    提起es的Update By Query很多人一定也不陌生 它对应的就是关系型数据库的update set where 语句 这对应一般的存储引擎而言算是最基本的功能 但它的坑确不少 多到让你使用起来很奔溃 比如批量更新时非事务模式执行 允
  • selenium自动化测试的问题解决及优化

    目录 一 安装出现的问题 1 webdriver has no attribute find element by id 2 gecodriver needs to be in PATH 3 安装了selenium报错has no attr
  • io第一天

    ubuntu ubuntu day1 c cat 8 c include
  • PL/SQL 导入SQL文件时报“Error reading file”

    从另一台机器上导出了一个表的数据 有2万多条 导出的sql文件大小将近40M 之后使用PL SQL的Command Window窗口执行sql文件 执行命令是 SQL文件全路径 提示错误 Error reading file不知道是不是因为
  • 在Ubuntu中安装中文输入法

    文章目录 前言 基础准备 ibus Intelligent Input Bus fcitx Flexible Input Method Framework 前言 Ubuntu中安装中文输入法相比Windows上要复杂不少 其实也不算复杂 就
  • js实现一个表单输入验证,重复字符验证

    logon password check 加班到现在 还是得发个 csdn 本文主要通过一个案例介绍两个东西 正则表达式中 必须含有某类字符的时候对应的 正则写法 在我之前的正则文章中已经写过了 重复字符以及连续字符的判断方式 正则来表示验