概述

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

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

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

太长不看版

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

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

^(?!^[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. js字符串转换为数字 总结

    a. 将一个字符串转换为数字的一种缺少些技巧但是很清楚明白的方法就是:把Number()构造函数作为一个函数来调用:  var number = Number(string_value); b. pa ...

  2. DB数据导出工具分享

    一个根据数据库链接字符串,sql语句 即可将结果集导出到Excel的工具 分享,支持sqlserver,mysql. 前因 一个月前朋友找到我,让我帮忙做一个根据sql导出查询结果到Excel的工具( ...

  3. Unity 游戏框架搭建 (二) 单例的模板

      上一篇文章中说到的manager of managers,其中每个manager都是单例的实现,当然也可以使用静态类实现,但是相比于静态类的实现,单例的实现更为通用,可以适用大多数情况. 如何设计 ...

  4. nodejs模块学习: connect解析

    nodejs模块学习: connect解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子来解决 ...

  5. 最新的极光推送服务器端代码(java服务器后台向手机端自定义推送消息)

    一共两个类 一个Jdpush  一个JpushClientUtil 代码如下   注解都写的很清楚 package com.sm.common.ajpush; import org.slf4j.Log ...

  6. Oracle数据库中的重要对象

    数据库中的重要对象:表.视图.序列.函数.存储过程.索引.同义词1.表:用PL/SQL Developer 软件打开 Scott的DEPT表查看SQL,可以看见DEPT表创建的脚本-- Create ...

  7. [故障公告]14:40-15:00博客站点web服务器雪崩似的CPU 100%

    非常抱歉,今天下午14:40-15:00左右,web服务器突然雪崩似的出现CPU 100%问题,造成博客站点无法访问(503).由此给您带来很大的麻烦,请您谅解. 在问题出现之前,博客站点运行着5台w ...

  8. python webserver, based on SimpleHTTPServer

    #-*- coding:utf-8 -*- #author: lichmama #email: nextgodhand@163.com #filename: httpd.py import io im ...

  9. VB6之借助zlib实现gzip解压缩

    这是个简版的,可以拿来做下网页gzip的解压缩,整好我的webserver还不支持这个,有时间了就加上. zlib.dll下载请点击我! 模块zlib.bas的代码如下: 'code by lichm ...

  10. MAC本上appium连接真机

    简单介绍一下appium连接ios真机测试环境的软件安装及配置过程: 目前我用的是desktop版本的appium, 所以MAC版本必须要升级到10.12以上,Xcode版本必须要在8.0以上,否则亲 ...