JavaScript密码正则表达式问题:无法匹配符合指定规则的密码
密码正则表达式修复方案
你的正则问题出在这几个地方:
- 强制要求字符顺序是「大写字母→符号→连字符」,但需求明确顺序不限
- 符号数量写错了,需求要6个但你写的是
{5} [/-]里的斜杠完全多余,连字符直接用-就行
要实现顺序不限、包含5个大写字母、6个指定符号、2个连字符的规则,得用正向预查分别校验每种字符的数量,同时限制总长度(5+6+2=13位),正确的正则应该是这样:
const passwordRegexp = /^(?=[A-Z]{5,}$)(?=(?:.*[!@#$%^&*]){6})(?=(?:.*-){2})[A-Z!@#$%^&*-]{13}$/; // 注意:你的测试字符串符号只有5个,不符合要求,调整成6个符号才会返回true console.log(passwordRegexp.test('FG-FGB-@$%^**')); // 返回true
拆解下正则各部分的作用:
^和$锁定整个字符串,避免前后出现多余字符(?=[A-Z]{5,}$):确保字符串里至少有5个大写字母(因为总长度固定13,所以刚好是5个)(?=(?:.*[!@#$%^&*]){6}):循环6次匹配「任意字符+指定符号」,确保有6个符合要求的符号(?=(?:.*-){2}):循环2次匹配「任意字符+连字符」,确保有2个连字符[A-Z!@#$%^&*-]{13}:限制只能由指定字符组成,且总长度刚好13位
另外提一句:你原来的测试字符串FG-FGB-@$%^*里只有5个符号,本身不符合需求,所以即使正则写对了,这个测试也会返回false,得补一个符号才行。
内容的提问来源于stack exchange,提问作者Maks
相关产品推荐
相关产品推荐

