概述

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

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

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

太长不看版

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

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

  1. ^(?!^[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的字符串时才匹配正则表达式。

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

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

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

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

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

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

把例子加深一下:

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

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

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

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

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

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

怎么样,思路出来了吗?

把例子再次深化:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. ^(?!^[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. (转载)oracle 在一个存储过程中调用另一个返回游标的存储过程

    原文链接:http://www.jb51.net/article/20160.htm 实际项目当中经常需要在一个存储过程中调用另一个存储过程返回的游标,本文列举了两种情况讲述具体的操作方法. 第一种情 ...

  2. VB6获取Chrome地址栏的URL信息

    上篇写到了获取IE8浏览器URL的一般方法,那这篇就写下chrome的URL怎么获取.事实上,早期的chrome版本可以通过跟IE8差不多方式获取到URL信息.但是,现在chrome的控件都是Dire ...

  3. 腾讯地图JS API实现带方向箭头的线路Polyline

    最近产品提出一个需求,在我们使用的腾讯地图上为线路polyline添加线路方向.例如下图所示: 查找腾讯地图JS API提供的API,没有找到对应的支持,询问负责腾讯地图的人也得到了同样的答案,即地图 ...

  4. Asp.net管理信息系统中数据统计功能的实现

    数据统计是每个系统中必备的功能,在给领导汇报统计数据,工作中需要的进展数据时非常有用. 在我看来,一个统计的模块应该实现以下功能: 能够将常用的查询的统计结果显示出来: 显示的结果可以是表格形式,也可 ...

  5. spring框架-spring.xml配置文件

    运行的时候会报错的,因为写到<bean>标签里面去了,肯定会报错的,要记得把注释删掉,就不会报错了,这样写注释是为了方便下次自己看. <?xml version="1.0& ...

  6. Quartz.Net 与 Autofac 自动注入 的整合问题

    一.问题发现 今天早上在用 Quartz.Net 做定时扫描异常队列的功能模块时,发现处理异常队列的Job里面的ILog对象服务,Autofac没有自动注入进来. 然后在网上查阅相关资料,无奈发现 Q ...

  7. (转)Spring Bean Scope 有状态的Bean 无状态的Bean

    有状态会话bean   :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”:一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束.即每个用户最初都会得到一 ...

  8. Maven常用的几个核心概念

    在使用Maven的过程中,经常会遇到几个核心的概念,准确的理解这些概念将会有莫大的帮助. 1. POM(Project Object Model)项目对象模型 POM 与 Java 代码实现了解耦,当 ...

  9. Python_网络爬虫(新浪新闻抓取)

    爬取前的准备: BeautifulSoup的导入:pip install BeautifulSoup4 requests的导入:pip install requests 下载jupyter noteb ...

  10. angularJS的$http.post请求,.net后台接收不到参数值的解决方案

    JS通用部分 var shoppingCartModule =angular.module('starter', ['ionic'], function ($httpProvider) { // Us ...