Skip to content

使用正则前瞻检查密码强度

需求: 密码长度 6-12 位, 且必须包含数字、小写字母、大写字母、特殊字符(,_@#$之一)

消耗字符

  • 默认情况下,正则表达式进行贪婪匹配。所谓贪婪,是指当匹配到多种长度的字符串时,选择最长的;而非贪婪,就是在匹配多种长度的字符串时,选择最短的。
  • 默认情况下,正则表达在匹配字符时,会把字符消耗掉;可以使用环视结构来匹配位置,使得正则不消耗字符,即正则在匹配文本时,不消耗字符,只匹配位置。

举个消耗字符的例子: 有这样一个正则/^\d+[a-z]+$/, 匹配值为 123abc, 结果肯定是能匹配上的,分析一下正则匹配时候的运行过程

  • 在开始匹配时候, 匹配位置在数字 1 的位置,1 能被匹配
  • 此时匹配的位置会向右边移动一下(左边的 1 已经看过了,不用再重新看了),移动到 2 的位置,2 也能匹配上
  • 根据这个规律依次进行,直到匹配结束
  • 匹配结束:匹配位置移动到最后,或者遇到不能匹配的字符(这里的例子为前者)

针对这里的需求,我们需要定几个规则 1.包含数字\d 2.包含小写字母[a-z] 3.包含大写字母[A-Z],4.包含[,_@#\$] 密码需要符合每一个规则,但是正则默认是会消耗字符的,若是能够不消耗字符,校验就变得简单了,前瞻就不会消耗字符

前瞻(正向预查)

语法:(?=), 匹配右边的字符

故名思意,就是站在某个位置向前瞻望,看前面的字符串是否符合规则,前瞻不会消耗字符

因此,校验密码强度的需求的正则可以写成

js
const reg = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[,_@#\$])[\d\w,@#\$]{6,12}$/;

这个正则表达式的组成部分解释如下:

  • ^ 和 $ 分别是字符串的开始和结束锚点。
  • (?=.*\d) 是一个正向预查,确保字符串中至少有一个数字。
  • (?=.*[a-z]) 是一个正向预查,确保字符串中至少有一个小写字母。
  • (?=.*[A-Z]) 是一个正向预查,确保字符串中至少有一个大写字母。
  • (?=.*[,_@#\$]) 是一个正向预查,确保字符串中至少有一个指定的特殊字符。
  • [\d\w,@#\$]{6,12} 确保整个字符串的长度在 6 到 12 个字符之间。

结果 alt text