js 密码 6-18 位正则校验问题

Awbeci
  • 2.5k

请问:为什么少于 6 位会报错,大于 18 位为什么不报啊?

{
  pattern: /^(?:\d+|[a-zA-Z]+|[!@#$%^&*]+){6,18}$/,
  message: "密码不正确,密码由6-18位数字、英文或特殊字符组成!"
}

clipboard.png

评论
阅读 1.3k
7 个回答
✓ 已被采纳
{
  //你想要的应该是这个,6~18位而且数字、字母、特殊字符至少出现一次
  pattern: /(?=.*\d)(?=.*[a-zA-Z])(?=.*[!@#$%^&*])^.{6,18}$,
  message: "密码不正确,密码由6-18位数字、英文或特殊字符组成!"
}

错误原因:
(\d+){6,18}相当于(\d{1,}){6,18}
所以(\d+){6,18}的意思是
数字至少出现1次的这种情况要出现6~18次才匹配,当6位数字以上时,“数字至少出现1次的这种情况”永远符合{6,18}

在正则中 ^ *等都属于正则的元字符,你需要斜杠转义。

var reg = /^[\dA-Za-z!@#$%^&*]{6,18}$/

请把括号里面的所有+去掉, 不然你后面的{6,18}匹配的括号里面组合重复6-18, 如'f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6f6'就不会通过:

/^(?:\d|[a-zA-Z]|[!@#$%^&*]){6,18}$/

/^[\da-zA-Z!@#$%^&*]{6,18}$/

去掉所有 +

{
  pattern: /^(?:\d|[a-zA-Z]|[!@#$%^&*]){6,18}$/,
  message: "密码不正确,密码由6-18位数字、英文或特殊字符组成!"
}

+号属于正则当中的量词,表示重复一次或更多次,{n,m}也是量词,表示匹配n到m次;按照你的写法,分组里面就不是匹配一个字符,而是多个字符;就d+来说 可以匹配100个1,而后又重复6到18次,就成了100个1的6次到18次,同理其他带+号的地方也一样;所以{6,18}确实限制了最少位,而没限制最大是18位

试试下面的写法:

let reg = /^[\w!@#$%^&*]{6,12}$/
宣传栏