概述

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

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

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

太长不看版

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

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

^(?!^[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. Maven pom.xml配置详解

    POM的全称是“ProjectObjectModel(项目对象模型)”. 声明规范 <projectxmlns="http://maven.apache.org/POM/4.0.0&q ...

  2. ActiveMQ 503错误

    问题描述: 在Linux系统下安装ActiveMQ,启动服务 正常启动后,通过浏览器进行访问 可以正常显示home页面,但是点击其他菜单,如Queues,Topics等,都会出现503错误,如图 问题 ...

  3. 使用Webpack加速Vue.js应用的4种方式

    Webpack是开发Vue.js单页应用程序的重要工具. 通过管理复杂的构建步骤,你可以更轻松地开发工作流程,并优化应用程序的大小和性能. 其中介绍下面四种方式: 单个文件组件 优化Vue构建 浏览器 ...

  4. C#获取数据库连接字符

    有两种用法:1)using System.Configuraiton; string ConStr=ConfigurationManager.ConnectionStrings["ConSt ...

  5. 第2篇:用as3.0制作一个滚动条组件

    本实例演示了实现一个滚动条基本功能的制作方法,没有添加改变皮肤,修改滚动条视框大小等功能,有兴趣的朋友可根据自己要求自行添加.使用时只需要通过以下一行代码创建滚动条组件: var myScrollba ...

  6. Jenkins设置Master/Slave

    说明:通过master/slave模式,可以在master节点上统一管理其他slave节点. 下面说明一步步实现master/slave模式. 第一步:以管理员登录jenkins.点击"系统 ...

  7. php利用ob缓存机制实现页面静态化方法全解

    首先介绍一下php中ob缓存常用到的几个常用函数 ob_start():开启缓存机制 ob_get_contents():获取ob缓存中的内容 ob_clean()清除ob缓存中的内容,但不关闭缓存 ...

  8. HTML中的行内元素和框元素详解

    定义 传统的块级元素定义中只是说明了在文档流中形成了一个块,在前后加换行,这里有些笼统. 其实框元素是指宏观上的框元素,它包括3种类型:1.本身就是块级元素 2.dispaly被设置为类block 3 ...

  9. CSS3文本

    1.文字省略 text-overflow:ellipsis; overflow:hidden; white-space:nowrap; //text-overflow(clip.ellipsis)只是 ...

  10. [luogu P3801] 红色的幻想乡 [线段树][树状数组]

    题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...