概述

续接上文的密码校验要求:

这个需求有两个难点,一,是如何使用正则匹配所有半角英文标点符号,二,是如何验证密码段中在要求的四种(大写字母,小写字母,数字,标点符号)类型中至少存在三种。

第一个难点:如何使用正则匹配所有半角英文标点符号在上文中已经得以解决,所以在这里我们主攻第二个难点并完成完整的符合需求的表达式。

太长不看版

满足需求:完全符合上述图片的校验需求,密码段中在要求的四种(大写字母,小写字母,数字,标点符号)类型中至少存在三种

解决方案:灵活运用正则中的零宽度负先行断言:

^(?!^[0-9a-z]+$)(?!^[0-9A-Z]+$)(?!^[0-9\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)(?!^[a-zA-Z]+$)(?!^[a-z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)(?!^[A-Z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)(?!^[A-Z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)[a-z0-9A-Z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$

能被匹配到的则满足上述图片需求

详细解释

零宽断言是正则表达式中的一种进阶使用方法,灵活运用零宽断言能让正则表达式变得更为简练,并且使其功能变得更为强大。

正则的零宽断言一般有以下四种:

借用司徒正美大大的解释

但可惜的是javascript并不支持(?<=exp)和(?<!exp)的用法。而我们这次使用的则是零宽度负先行断言

零宽度负先行断言原理解释:

(?!exp)这个断言的用法是:只有当字符串右侧不出现匹配exp的字符串时才匹配正则表达式。

我们先从一个简单的例子讲解:

如果我们要匹配一串字符,所有字符必须为小写字母或者数字,并且必须要有小写字母。

那么换一种思路,就是我们的字符串必须为小写字母或数字构成,并且不能为纯数字。

所以我们使用零宽度负先行断言,则可以写成

^(?!^[0-9]+$)[a-z0-9]+$

断言(?![1]+$)则表示纯数字的组合不能被匹配。

把例子加深一下:

我们要匹配一串字符,所有字符必须为小写字母或者数字,并且必须同时有小写字母和数字的存在。

那么换一种思路,就是我们的字符串必须为小写字母或数字构成,并且不能为纯数字或者是纯小写字母。

所以我们使用零宽度负先行断言,则可以写成

^(?!^[0-9]+$)(?!^[a-z]+$)[a-z0-9]+$

断言(?![0-9]+$)则表示纯数字的组合不能被匹配;断言(?![a-z]+$)则表示纯小写字母的组合不能被匹配。

二者相组合,就能够把所有纯数字和纯小写字母的组合给排除掉了,剩下的就是同时有小写字母和数字的组合。

怎么样,思路出来了吗?

把例子再次深化:

我们要匹配一串字符,所有字符必须为小写字母或者数字或者大写字母,并且必须至少有三种字符中的两种。

那么我们整理下思路,实际上就是我们的字符串必须为上述三种字符构成,并且不能为纯数字或纯小写字母或纯大写字母。

所以我们使用零宽度负先行断言,则可以写成

^(?!^[0-9]+$)(?!^[a-z]+$)(?!^[A-Z]+$)[a-z0-9A-Z]+$

这样做,就可以把纯数字(?![0-9]+$),纯小写字母(?![a-z]+$),纯大写字母(?![2]+$)统统排除了。

练级完成,是时候面对大BOSS了

在上一篇JS的JS正则密码复杂度校验文章中,我们知道了要匹配所有的半角表单符号的正则表达式是:

/[\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]/

配合上面的断言语句,我们可以去单挑boss了:

验证密码段中在要求的四种(大写字母,小写字母,数字,标点符号)类型中至少存在三种,我们就可以将思路转换为:

在只有上述四种类型范围的字符串中,找出所有从头到尾只有两种以下字符的字符串并将它们排除就可以了。

那么根据排列组合,我们需要排出的就是

数字和小写字母(?![3]$),

数字和大写字母(?![4]$),

数字和符号(?![5]$),

小写字母和大写字母(?![6]$),

小写字母和符号(?![7]$)

还有大写字母和符号(?![8]$)

于是乎,最后的正则成品:

^(?!^[0-9a-z]+$)(?!^[0-9A-Z]+$)(?!^[0-9\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)(?!^[a-zA-Z]+$)(?!^[a-z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)(?!^[A-Z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)(?!^[A-Z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$)[a-z0-9A-Z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F]+$

就能满足我们的需求

总结

正则表达式的学习入门比较容易,上手也不难。在面对一些很长的正则表达式或者看似奇葩的正则表达式匹配需求时,我们不妨静下心来,慢慢地去分析它们,找到个中规律之后,正则表达式的迷雾也就被揭开了。而正则表达式这把神器,也能被我们随心所欲地挥舞了。


  1. 0-9 ↩︎

  2. A-Z ↩︎

  3. 0-9a-z ↩︎

  4. 0-9A-Z ↩︎

  5. 0-9\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F ↩︎

  6. a-zA-Z ↩︎

  7. a-z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F ↩︎

  8. A-Z\x21-\x2f\x3a-\x40\x5b-\x60\x7B-\x7F ↩︎

JS正则密码复杂度校验之:至少有多种字符中的其中几种的更多相关文章

  1. JS正则密码复杂度校验之:JS正则匹配半角英文符号

    概述 在JS密码校验中常常会遇到密码强度的校验需求,借用一位朋友提问的图,他在工作中遇到的一个比较经典的密码强度校验要求: 这个需求有两个难点,一,是如何使用正则匹配所有半角英文标点符号,二,是如何验 ...

  2. Linux下修改密码复杂度

    在linux,设置密码复杂度的方法有几个1. 一个是在/etc/login.defs文件,里面几个选项PASS_MAX_DAYS 90 #密码最长过期天数PASS_MIN_DAYS 80 #密码最小过 ...

  3. 【JS】JS校验密码复杂度(必须包含字母、数字、特殊符号)

    #场景一:密码中必须包含大小写 字母.数字.特称字符,至少8个字符,最多30个字符: var pwdRegex = new RegExp('(?=.*[0-9])(?=.*[A-Z])(?=.*[a- ...

  4. JS正则检测密码强度

    今天遇到个需求,使用JS检测密码强度:密码长度最短为8,必须同时包含字母.数字.特殊符号. 代码如下: /*         * 检测密码复杂度         */         function ...

  5. js 正则之 判断密码类型

    原文:js 正则之 判断密码类型 今天没啥写的,就分享个思路吧.之前在群里讨论的时候,谢亮兄弟说判断密码是否是纯数字,纯字母之类的.如果用 , 条判断,那就老长一大段了.这个思路是我之前看 jQuer ...

  6. Javascript校验密码复杂度的正则表达式

    1.密码中必须包含大小字母.数字.特称字符,至少8个字符,最多30个字符. var regex = new RegExp('(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z])(?=.* ...

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

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

  8. [js]正则篇

    一.正则基本概念 1.一种规则.模式.文本处理工具 2.强大的字符串匹配工具 3.在js中常与字符串函数配合使用 二.js正则写法 正则在js中以正则对象存在: (1)var re=new RegEx ...

  9. 正则表达式控制Input输入内容 ,js正则验证方法大全

    https://blog.csdn.net/xushichang/article/details/4041507 //输入姓名的正则校验 e.currentTarget.value = e.curre ...

随机推荐

  1. 使用docker-compose搭建AspNetCore开发环境

    1 使用docker-compose搭建开发环境 我们的目标很简单:使用docker-compose把若干个docker容器组合起来就成了. 首先使用Nginx代理所有的Web程序,这样只需要在主机上 ...

  2. Python3中文件处理

    1.txt,xls,doc等文件的使用 f=open("filename","w")   打开一个用于写入的文件,要写入内容时使用f.write("内 ...

  3. 第1章 ssh和SSH服务(包含隧道内容)

    本文对SSH连接验证机制进行了非常详细的分析,还详细介绍了ssh客户端工具的各种功能,相信能让各位对ssh有个全方位较透彻的了解,而不是仅仅只会用它来连接远程主机. 另外,本人翻译了ssh客户端命令的 ...

  4. NavigationView的头部的事件监听

    现在App的UI设计中Drawerlayout+NavigationView是一个比较常用的设计了,而以前我一般只是在Navigation中的menu(即下部的item中)添加事件监听,而今天碰到一个 ...

  5. ES语法注意事项

    在函数内部定义全局变量:举个栗子 function fn(){ var str = "hezhi"; } -alert(str) //=>fn不执行的 =>str is ...

  6. Complete

    complete为动画结束时的回调函数,在无限循环模式下(设置loop: true) 该回调函数将不会执行,但是有规定次数的循环模式下(比如设置设置loop: 3) 该回调函数 将只会在最后一次循环结 ...

  7. set-集合功能介绍

    叨逼叨:#集合 不可重复的列表 可变类型#1.添加 无则添加有则不操作 不可重复 # se = {'alex','eric','seven'} # se.add('qiqi') # se.add('b ...

  8. PHP----SAPI

    SAPI:Server Application Programming Interface 服务器端应用编程端口.它就是PHP与其它应用交互的接口,PHP脚本要执行有很多种方式,通过Web服务器,或者 ...

  9. MySQL 启动参数说明及性能优化建议

    [mysqld] port = 3306 serverid = 1 socket = /tmp/mysql.sock skip-name-resolve #禁止MySQL对外部连接进行DNS解析,使用 ...

  10. FreeRTOS——中断管理

    1. 只有以“FromISR”或"FROM_ISR"结束的API函数或宏才可以在中断服务函数中使用. 2. 除互斥信号量外,所有类型的信号量都可以调用 xSemaphoreTake ...