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

要求:长度为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}$/

求大佬指点一下

阅读 2.4k
2 个回答

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

) 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
  )
}
// 大写字母,小写字母,数字,特殊符号 `@#$%^&*`~()-+= 中任意3项

/^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\W_!@#$%^&*`~()-+=]+$)(?![0-9\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\W_!@#$%^&*`~()-+=]/

特殊字符你可能要自己手动添加一下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题