js 需要一个密码校验正则表达式?

作者站长头像
站长
· 阅读数 13

要求:长度为8到32位的字符串,必须包含如下四种字符中的三种组合:小写字母、大写字母、数字、特殊字符包括 `~!@#$%^&*()-_=+|[{}]:'",<.>/?

我写的好像有问题

/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_`~!@#$%^&*()-_=+\\/|[{}\]/:'",<.>/?]+$)(?![a-z0-9]+$)(?![a-z\W_`~!@#$%^&*()-_=+\\/|[{}\]/:'",<.>/?]+$)(?![0-9\W_`~!@#$%^&*()-_=+\\/|[{}\]/:'",<.>/?]+$)[a-zA-Z0-9\W_`~!@#$%^&*()-_=+\\/|[{}\]/:'",<.>/?]{8,32}$/

求大佬指点一下

回复
1个回答
avatar
test
2024-07-20

有个需要注意的地方是 -[] 中用于指定范围,匹配 - 字符本身需要转义或放在开头

) ascii 码是 41,_ ascii 码是 95,因此 [)-_] 将匹配 ascii 码 41 到 95 所有字符,其中包含数字(48~57)和大写字母(65~90)

修复方法是 - 前加 \ 进行转义

/[`~!@#$%^&*()\-_=+|[{}\]:'",<.>/?]/

或者放在开头

/[-`~!@#$%^&*()_=+|[{}\]:'",<.>/?]/

对一下 ascii 码表发现特殊字符是除了控制符、数字、大小写字母、空格、;\ 以外的 ascii 字符(看你下面的正则里又多了 \,还写了三遍 / 两遍 _,不知道是不是写错,这里暂时以上面 `~!@#$%^&*()-_=+|[{}]:'",<.>/? 为准),因此也可以这样写

/(?![\da-z;\\])[\x21-\x7e]/i

如果不限制只使用一个正则,则建议正则仅用于简单有把握的匹配,像限制至少三种字符这种还是另外判断好

function validatePassword(password) {
  return (
    /^(?:(?![;\\])[\x21-\x7e]){8,32}$/.test(password) &&
    [/\d/, /[A-Z]/, /[a-z]/, /(?![\da-z;\\])[\x21-\x7e]/i].reduce(
      (cnt, re) => cnt + re.test(password),
      0
    ) >= 3
  )
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容