JavaScript密码强度校验:两种正则表达式方案详解与测试

作者:工具箱

时间:2026-10-22

浏览:186

本文介绍两种用于JavaScript的密码强度正则表达式方案。方案1为简单模式,仅限制长度及字符类型;方案2为安全模式,强制要求数字、大小写字母及特殊字符的组合。文章详细解析了正则语法并提供了完整的测试代码,帮助开发者根据项目需求选择合适的密码验证策略。

文章目录

前言与方案概述

本文提供了两种用于校验密码强度的正则表达式方案,分别侧重于简单性和安全性。文中包含对这两种方案的详细解析以及配套的测试程序。开发者可根据自身项目的具体安全需求,参考并自定义相应的密码正则规则。

前言与方案概述 

前言

在用户注册环节,通常需要使用正则表达式对密码进行格式校验。要编写出正确的正则表达式,首要步骤是明确定义校验规则。

方案1:简单密码校验

方案1(简单模式)

假设对密码验证设定以下规则:

  • 密码长度最短6位,最长16位,对应量词 {6,16}
  • 允许包含小写字母 [a-z] 和大写字母 [A-Z]
  • 允许包含数字 [0-9]
  • 允许包含下划线 [ _ ] 和减号 [ - ]

基于上述规则,可定义如下正则字面量:


var pattern = /^[\w_-]{6,16}$/;

方案1正则语法解析

方案1分析

正则字面量语法 / /

正则表达式的字面量形式由一对斜杠(/)包裹字符构成,例如:


var pattern = /s$/;

上述字面量用于匹配所有以字母“s”结尾的字符串。

字符类 [ ]

将字符置于方括号内即构成字符类。一个字符类能够匹配其包含的任意单个字符。因此,正则表达式 /[abc]/ 可匹配字母“a”、“b”或“c”中的任意一个。

字符类支持使用连字符表示字符范围。例如,匹配拉丁小写字母可使用 /[a-z]/ 。

字符类 \w

字符类 \w 用于匹配由ASCII字符组成的单词字符,其功能等价于 [a-zA-Z0-9]。

[\w_-] 表示匹配任意拉丁大小写字母、数字,以及下划线和减号。

重复量词 { }

在正则表达式中,使用 { } 来指定元素重复出现的次数。

  • {n,m} 匹配前一项至少n次,但不超过m次
  • {n,} 匹配前一项n次或更多次
  • {n} 精确匹配前一项n次

[\w_-]{6,16} 表示匹配由拉丁大小写字母、数字、下划线和减号组成的字符串,长度最少6次,最多16次。

匹配位置锚点

^ 匹配字符串的开头;在多行模式下,匹配每一行的开头 $ 匹配字符串的结尾;在多行模式下,匹配每一行的结尾 /^\w/ 用于匹配以大小写字母或数字开头的字符串。

方案1测试与评估

方案1测试

测试结果如下所示:


var pattern = /^[\w_-]{6,16}$/;
pattern.test('123456') = true;
pattern.test('-ifat33') = true;
pattern.test('42du') = false;
pattern.test('du42du42du42du421') = false;
pattern.test('42du42@') = false;

查看源码

根据测试结果分析,方案1仅对密码进行了基础限定,无法充分保证密码强度及账户安全。

方案2:安全密码校验

方案2(安全模式)

假设对密码验证设定以下更严格的规则:

  • 密码长度最短6位,最长16位,对应量词 {6,16}
  • 必须包含至少1个数字
  • 必须包含至少2个小写字母
  • 必须包含至少2个大写字母
  • 必须包含至少1个特殊字符

基于上述规则,定义如下正则字面量:


var pattern = /^.*(?=.{6,16})(?=.*\d)(?=.*[A-Z]{2,})(?=.*[a-z]{2,})(?=.*[!@#$%^&*?\(\)]).*$/;

方案2正则语法解析

方案2分析

字符类 .

字符类 . 表示匹配除换行符和其他Unicode行终止符之外的任意字符。

正向先行断言 (?= )

在符号“(?=” 和 “)” 之间嵌入一个子表达式,即构成先行断言,用于声明圆括号内的表达式必须成功匹配。例如: /Java(?=\:)/ 仅匹配后面紧跟冒号的“Java”。

(?=.*[!@#$%^&*?\(\)])

该先行断言表示,必须包括一个特殊字符。上述表达式中的10个特殊字符为键盘1,2...0的上档键字符,也可以添加别的特殊字符。注意:如果添加字符是正则表达式中具有特殊含义的,需要在符号前加反斜线(\)转义。

方案2测试与评估

方案2测试

测试结果如下所示:


var pattern = /^.*(?=.{6,16})(?=.*\d)(?=.*[A-Z]{2,})(?=.*[a-z]{2,})(?=.*[!@#$%^&*?\(\)]).*$/;
pattern.test('du42DU!') = true;
pattern.test('duDUd!') = false;
pattern.test('42dud!') = false;
pattern.test('42DUD!') = false;
pattern.test('42duDU') = false;
pattern.test('42duU(') = false;
pattern.test('42dUU!') = false;

总结

以上介绍了两种密码强度的正则表达式JS方案,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章