现在有一个匹配问题,匹配密码,必须包含大写,小写和数字,和特殊字符(!,@,#,%,&),且大于6位。

先看明白要匹配的条件,必须包含大写、小写、数字和特殊字符,但是出现的顺序没有规定,只要包含有就行,一般的正则表达式都是按顺序来进行匹配的,所以有什么办法可以解决这个没有顺序的匹配呢,或者说有什么匹配机制可以每次匹配完,又重新从头开始进行下一次匹配呢?前瞻就可以。

1.前瞻表达式

在正则表达式当中有个东西叫做前瞻,有的管它叫零宽断言:

表达式 名称 描述
(?=exp) 正向前瞻 匹配后面满足表达式exp的位置
(?!exp) 负向前瞻 匹配后面不满足表达式exp的位置

我们来看看前瞻的作用:

var str = 'Hello, Hi, I am Hilary.';
// 后面一定要匹配什么
var reg = /H(?=i)/g;
var newStr = str.replace(reg, "T");
console.log(newStr);//Hello, Ti, I am Tilary.

在这个DEMO中我们可以看出正向前瞻的作用,同样是字符"H",但是只匹配"H"后面紧跟"i"的"H"。就相当于有一家公司reg,这时候有多名"H"人员前来应聘,但是reg公司提出了一个硬条件是必须掌握"i"这项技能,所以"Hello"就自然的被淘汰掉了。

以上内容摘至 : https://www.cnblogs.com/dong-xu/p/6926064.html

2.前瞻表达式每次进行匹配lastIndex(查找的起点 )都为0

如果是普通的正则表达式,且匹配模式是全局匹配(global),lastIndex匹配结果如下:

var str = 'aaaAAA'
var reg = /(.*[A-Z])/g
console.log(reg.lastIndex);  // 输出 0
console.log(reg.exec(str));  // 简写就是匹配为 [aaaAAA]
console.log(reg.lastIndex);  // 输出6  表示下次匹配从下标6开始

如果是前瞻表达式,lastIndex匹配结果如下:

var str = 'aaaAAA'
var reg = /(?=.*[A-Z])/g
console.log(reg.lastIndex);  // 输出 0
console.log(reg.exec(str));  // 简写就是匹配到 [''] 即匹配到aaaAAA的前面位置,是空的
console.log(reg.lastIndex);  // 输出0  表示下次匹配从下标0开始

所以说用前瞻表达式进行匹配,每次都是从头开始的。(不论匹配模式是否是全局匹配 global),

我们可以利用这个特性来进行没有顺序的匹配。

3.密码匹配问题(匹配密码,必须包含大写,小写和数字,和特殊字符(!,@,#,%,&),且大于6位。)

有了上面的基础,就可以进行密码匹配了,我们先效验密码必须包含大写、小写、数字和特殊字符:

var reg = /(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#%&])/g
//因为大写、小写、数字、特殊字符出现的位置未知
//所以要在每个表达式前加上 .* 表示前面可能有内容,可能没有内容
//用前瞻只是为了它会重新开始的机制,并不用它匹配到的前面的内容

然后上面条件满足了就可以限制其次数:

var reg = /^[A-Za-z\d!@#%&]{6,}$/g

最后可以把两个正则表达式合在一起就可以进行密码匹配

var str = '@GGA3124a3523'
var reg = /(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[!@#%&])^[A-Za-z\d!@#%&]{6,}$/g
console.log(reg.test(str));  // true

JS(ES5)正则表达式(多个前瞻存在情况)进行密码匹配相关推荐

  1. 史上最详细的js日期正则表达式分享

    最简单的正则 如 : /d{4}-/d{2}-/d{2} 但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题..... 对于日期的有效范围,不同的应用场景会有所不同.MSDN中定义的DateTi ...

  2. 重新拎一遍js的正则表达式

    前言 js的正则表达式是前端中比较重要的部分,加入你要去面试,正则的题目必不可少.我之前的这篇文章中提及过.具体可以看:http://www.haorooms.com/post/qianduan_mi ...

  3. 收集的JS常用正则表达式等

    //   短日期,形如 (2003-12-05) function strDateTime(str) { var r = str.match(/^(d)(-│/)(d)2(d)$/); if(r==n ...

  4. 收集的JS常用正则表达式等(转载)

    //   短日期,形如 (2003-12-05)  function strDateTime(str)  {  var r = str.match(/^(d)(-│/)(d)2(d)$/);  if( ...

  5. 【JS】正则表达式。以vue词法分析、句法分析为例

    1,声明 其声明和其他的基本类型类似,都可以用字面量声明,或者包装类声明: console.log(/abc/g); // /abc/gconsole.log(new RegExp("abc ...

  6. html正则表达式 数字,js的正则表达式教程 js 正则表达式 3位数字

    允许空格和~之间的字符但不包含# " ' & = < > ( ) % + \ ; $ | / 用eval转义,你现在reg是一个字符串 正确写法 var ch = &qu ...

  7. js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr)...

    js进阶正则表达式15验证身份证号(|符号的使用:var reg=/^\d{17}[\d|X]$|^\d{15}$/)(str的方法substr) 一.总结 1.|符号的使用:var reg=/^\d ...

  8. js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g)...

    js进阶正则表达式方括号(方括号作用)(js正则是在双正斜杠之中:/[a-z]/g) 一.总结 方括号:范围 圆括号:选 大括号:数量 1.js正则是在双正斜杠之中: var reg2=/[a-z]/ ...

  9. JS的正则表达式[收藏]

    JS的正则表达式 //校验是否全由数字组成 代码 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) return ...

最新文章

  1. ListView style
  2. Java中的String字符串
  3. slider_wap
  4. Git 基本工作流程
  5. Bit-Z CEO长顺入围2018中国经济潮流人物
  6. NMF和SVD在推荐系统中的应用(实战)
  7. win98 老电脑 文件导出_首次装电脑之前何不先模拟一番,这款练手神器可以帮你...
  8. SCCM 2012系列3 安装SCCM 2012
  9. jmeter单线程读取csv_jmeter中如何使用csv文件并读取数据
  10. 二进制文件(.bin)查看
  11. 如何批量转换图片格式?怎样统一修改图片格式?
  12. linux wav 转mp3,linux下wav转换为mp3
  13. 成都焱炎 抖音AI大数据 不root 不装xp
  14. 日常记账如何自定义设置收支类别及账户
  15. android日程源代码,android日程表实现---仿滴答清单
  16. 优秀的免版权图库软件推荐,软件内图片均可免费商用。
  17. 华3C交换机调试基本
  18. 交换游戏(状态压缩、记忆化搜索)
  19. 【Sql】sql server2008附加数据库:错误9003
  20. Nordic nRF52832申报要素

热门文章

  1. [Toddler's Bottle]fd
  2. node升级版本、npm升级版本
  3. 微信开发者工具的更新
  4. 计算机桌面怎么全屏显示,电脑显示器如何设置成满屏
  5. 数据结构入门学习之数据结构学些什么?
  6. delphi去掉字段前后的引号_Delphi编程SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法...
  7. logback的additivity=false 与root关系
  8. 干货:蓝海创意云制作液体教程来啦~
  9. html调起苹果手机摄像头_html5摄像头 如何调用手机摄像头
  10. javascript中的沙箱